Castle Windsor IoC容器的实体框架 - 验证错误

时间:2013-09-12 13:10:39

标签: entity-framework castle-windsor mvp

我正在使用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表中),从而生成验证异常,因为没有为此发送数据部门显然!

1 个答案:

答案 0 :(得分:1)

Castle Windsor默认执行隐式属性注入,这意味着它会尝试在正在创建的类型上注入每个公共属性。当Employee具有Department属性时,它将尝试创建Department实例,如果成功,则会将其注入该属性。这显然是这里发生的事情。

您应该使用您的IoC容器 来构建服务的对象图,而不是实体。不要那样做。

相关问题