【发布时间】:2014-06-20 10:34:29
【问题描述】:
我对 EF 并不出色,所以也许它很容易。
我有
public void DeleteLicense(int licenseId)
{
var entityToDelete = context.Licenses.Find(licenseId);
context.Licenses.Remove(entityToDelete);
}
我检查了它是否找到了正确的许可证,并且上下文是一个 ninject(每个请求一个)DbContext,
但是当我在运行上述函数后在上下文中调用 SaveChanges() 时遇到一个奇怪的错误。我得到:“CustomerName 字段是必需的。”
现在这很奇怪,因为 CustomerName 在 Account(不是 License)中,它们是链接的,但仍然存在。所以这里还有一些:
我的帐户实体
[Required]
public String CustomerName { get; set; }
public virtual ICollection<License> Licenses { get; set; }
...
我的许可证实体
public virtual Account Account { get; set; }
...
我的流畅设置
modelBuilder.Entity<Account>().HasMany(x => x.Licenses)
.WithRequired(x => x.Account).WillCascadeOnDelete(false);
我不明白,因为即使有一个失败的约束,为什么缺少 CustomerName。删除许可证时我没有触摸 CustomerName,并且之前设置了 CustomerName。
更新
所以这里有一些来自代码的更多细节。据我所知,完整的执行路径是
DeleteLicenseAPI 下面的调用,ID 是正确的,它传递给一个私有函数。 私有函数调用显示在问题顶部附近的 DeleteLicense。 Commit() 只调用 context.SaveChanges();
public ActionResult DeleteLicenseAPI(int licenseId)
{
if (DeleteLicense(licenseId))
{
return Content("ok");
}
return Content("[[[Failed to delete license]]]");
}
private bool DeleteLicense(int licenseId)
{
//todo: sort out busniess rules for delete, is cascaded?
_accountRepository.DeleteLicense(licenseId);
_accountRepository.Commit();
return true;
}
_accountRepository 看起来像这样
public class EFAccountRepository : EntityFrameworkRepository<Account>
, IAccountRepository
public EFAccountRepository(EvercateContext context) : base(context)
{
}
这是 Ninject 中的代码
kernel.Bind<EvercateContext>()
.To<EvercateContext>()
.InRequestScope()
.WithConstructorArgument("connectionStringOrName", "EvercateConnection");
kernel.Bind<IAccountRepository>().To<EFAccountRepository>();
因此,即使我使用了工作单元,就我所见(而且它不应该)在运行 SaveChanges 之前在此请求中没有调用任何其他内容。 有什么方法可以查看 DbContext 将在 SaveChanges 上做什么,而无需实际运行该方法(因为它会抛出 DbEntityValidationException)
【问题讨论】:
-
似乎没有意义。这是
DeleteLicense方法的一部分,您可能会在其中无意中创建Account吗? -
很高兴知道这不仅仅是我。我更新了问题中的更多细节。但总结是:我可以看到不运行 SaveChanges 会做什么吗?
-
您可以在
DbContext中覆盖SaveChanges并检查this.ChangeTracker.Entries()的内容。
标签: c# entity-framework entity-framework-6