EF4关系无法正确更新

时间:2011-10-18 23:44:12

标签: c# entity-framework entity-framework-4 datacontext

好的,我正在研究一个项目并且刚刚提交了一个我遇到麻烦的错误。代码是以“不同”的方式编写的,我认为原始开发人员接触这个项目的方式是为了解决一些问题,其中一个是我今天要处理的问题。基本上,我们有类似的东西:

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_Comments的EntityCollection。

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

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

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

希望一切都有意义,让我知道我是否可以帮助澄清任何事情。有什么想法吗?

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

1 个答案:

答案 0 :(得分:1)

你的问题是.Clear()导致第二个上下文取消了Review_Comments与Review的关联,它从未意识到Review_Comment实际上已被删除。

你应该这样做

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

如果您在“review.Review_Comment”中观察评论的实体状态,您应该看到在刷新之后,其状态变为“已分离”而非“已修改”