我正在使用MVP,EntityFramework和Castle Windsor的实现。
然而,一切似乎都很好,但是当使用dbContext.SaveChanges()向表中添加新记录(其中有多个外键将其映射到其他表)时,EntityFramework似乎继续并尝试在其他所有表中插入记录表中包含外键的表。
例如:员工表有一个外键,将其链接到部门表。当EF被要求在员工表上保存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(在构造函数中)。发生的事情是,因为Deparment在Employee中有一个'Navigation Property',每次我插入一个新员工时,EntityFramework都会在其中插入一个空白部门(在Department表中),从而生成验证异常,因为没有为此发送数据部门显然!
答案 0 :(得分:1)
Castle Windsor默认执行隐式属性注入,这意味着它会尝试在正在创建的类型上注入每个公共属性。当Employee
具有Department
属性时,它将尝试创建Department
实例,如果成功,则会将其注入该属性。这显然是这里发生的事情。
您应该使用您的IoC容器 来构建服务的对象图,而不是实体。不要那样做。