4

我们的实体框架有问题。例如,如果我们这样做:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

然后我们尝试删除一个映射了依赖它的子实体的实体,我们得到一个错误是合乎逻辑的。(当数据库中有依赖于它的子级时,不能删除父级)。

之后,使用新的上下文实例,执行 'ParentEntity.ChildEntities.ToList()' 仍然有问题!

一种解决方法是重新启动应用程序池,问题就消失了。

我们正在使用 Autofac 并且上下文的生命周期被设置(并确认)为每个 HttpRequest,因此错误在其他地方仍然存在。知道可以做些什么来避免这些错误吗?

我们的猜测是 objectcontext 在其他地方是持久的,它将子实体的状态存储为“EntityState.Deleted”,因此这与在后续调用中从数据库接收的实际数据相冲突。

更新:似乎对堆栈的仔细检查表明存在一个惰性内部上下文:

[DbUpdateException: An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.]
    System.Data.Entity.Internal.InternalContext.SaveChanges() +200
    System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +33
    System.Data.Entity.DbContext.SaveChanges() +20

也许如果我以某种方式禁用 LazyInternalContext?这可以做到吗?

4

1 回答 1

0

如果您出于某种原因不想获取异常并将数据库保持在有效状态,您可以通过停止验证来做到这一点:

context.Configuration.ValidateOnSaveEnabled = false; // you can put this in the constructor of your context;
context.SaveChanges();
于 2013-03-02T00:02:34.697 回答