【发布时间】:2013-09-12 23:35:02
【问题描述】:
我正在使用 MVP、EntityFramework 和 Castle Windsor 的实现。
一切似乎都很好,但是当使用 dbContext.SaveChanges() 将新记录添加到表中(其中有许多将其映射到其他表的外键)时,EntityFramework 似乎继续并尝试在每个其他表中插入记录直接表中带有外键的表。
例如:Employee 表有一个外键,将其链接到 Department 表。当 EF 被要求对 Employee 表执行 SaveChanges() 时;它继续在 Department 表中插入一条空记录,这不是必需的,这会触发此异常:
一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
我已经用这个“捕捉”了这个异常的细节:
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
//For QuickWatch
//((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors.First().ValidationErrors.First().ErrorMessage
}
}
}
问题似乎是在保存更改时发生的;当温莎城堡已经为每个实体实例化了“对象”时。这些实例使 EF 认为它们可以保存到数据库中,这会导致验证错误,因为没有数据被发送到任何这些表中。
我能做些什么来解决这个问题。为实体模型创建一个基类会有帮助吗?如果是,我该怎么做?
请告诉我。谢谢。
更新
@Steven 依赖项没有被注入到实体中。实体被注入到 Presenters 中(在构造函数中)。发生的事情是,因为部门在员工中有一个“导航属性”,所以每次我插入一个新员工时,EntityFramework 都会插入一个空白部门(在部门表中),从而生成验证异常,因为没有为部门明明!
【问题讨论】:
-
您将哪些依赖项注入到您的实体中?
-
@Steven 我已经在更新中回答了问题本身。
-
那你为什么不
newPresenter 中的员工呢? -
@Steven 这将解决我尝试过的问题,但不符合我通过温莎注入所有东西的要求。我知道为实体创建一个基类是一个解决方案;一种管理实体的“生活方式”或“生命周期”的方法。我只是不知道该怎么做。
-
恐怕你误解了依赖注入,因为它并不是要让容器解析每个实例。看看this article,它很好地解释了要解决的问题以及要自己更新的内容。
标签: entity-framework castle-windsor mvp