EF4关系没有正确更新



好吧,我正在做一个项目,刚收到一个bug,我遇到了一点麻烦。代码是以一种"不同"的方式编写的,我认为最初的开发人员处理这个项目的方式给它带来了一些问题,我今天正在处理的其中一个问题。基本上,我们有这样的东西:

Review_Comment comment = commentContext.Review_Comment.First(c => c.CommentID == commentID);
commentContext.DeleteObject(comment);
commentContext.SaveChanges();
review.Review_Comment.Clear();
review.Review_Comment.Load(System.Data.Objects.MergeOption.OverwriteChanges);
context.SaveChanges();

让我先解释一些事情,然后再解释问题:

  • "review"是review类的一个实例,它是一组"Review_Comments"的父类(即Review_Comments属于单个review)。
  • 上面的功能是删除注释。
  • 注释,无论好坏,都使用它们自己的EF4上下文(与"review"变量所附加的上下文分开)。
  • 最初的开发人员试图做的,我认为是加载评论在一个单独的上下文中,删除它,然后在单独的"Review"类手动更新Review_Comments的EntityCollection。

但是,当调用context.SaveChanges()时,我们得到以下错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性被设置为空值。如果外键不支持空值,则必须定义一个新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

我已经看到这个错误描述当人们试图删除说,一个订单对象和相关的OrderItems没有被正确删除,但这种情况是不同的。我们正在尝试删除单个子对象,然后使用单独的上下文更新另一个实体上的EntityCollection。

希望这一切都是有意义的,如果我能帮助澄清任何事情,请告诉我。任何想法吗?

EDIT:我应该提一下,我能够通过使用页面其余部分使用的相同上下文来解决这个问题。然而,在这种情况下,由于前面的开发人员引入了几个依赖项,我必须保留第二个上下文,否则我必须重写大量代码来删除对第二个上下文的依赖项,以修复这个错误。我希望能找到一个不用花太多时间的解决办法。目标是删除评论,然后重新加载单独实体的Review_Comment EntityCollection,并且能够调用SaveChanges()而不会出现此错误。

您的问题是. clear()导致第二个上下文将Review_Comments与其Review分离,它从未意识到Review_Comment实际上已被删除。

你应该这样做

  context.Refresh(RefreshMode.StoreWins, review.Review_Comment );
  context.SaveChanges();

如果您在"review"中查看评论的实体状态。Review_Comment",您应该看到在刷新之后,它的状态变成了"Detached"而不是"Modified"

最新更新