1

我正在使用 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 Dependencies 没有被注入实体。实体被注入到 Presenters 中(在构造函数中)。发生的事情是,因为部门在员工中有一个“导航属性”,所以每次我插入一个新员工时,EntityFramework 都会插入一个空白部门(在部门表中),从而生成验证异常,因为没有为部门明明!

4

1 回答 1

1

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

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

于 2013-09-12T13:43:01.523 回答