【问题标题】:EF4 Relationships Not Updating CorrectlyEF4 关系未正确更新
【发布时间】:2011-10-20 05:13:37
【问题描述】:

好的,我正在处理一个项目,只是收到了一个我遇到了一些麻烦的错误。代码是以“不同”的方式编写的,我认为最初的开发人员处理这个项目的方式为一些问题设置了它,我今天正在处理其中一个问题。基本上,我们有这样的东西:

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)。
  • 上面的功能是删除评论。
  • 无论好坏,cmets 都使用自己的 EF4 上下文(与附加“review”变量的上下文分开。这很重要。
  • 我认为最初的开发人员试图做的是在单独的上下文中加载评论,将其删除,然后手动更新单独的“评论”类中 Review_Comments 的 EntityCollection。

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

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

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

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

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

【问题讨论】:

  • “有什么想法吗?” - 不要使用第二个上下文?
  • 是的,我已经通过这样做修复了它,但是它不会飞。依赖于第二个上下文,有一个完整的错综复杂的网络。我的偏好是解决所有这些问题,但优先级是修复错误。我宁愿这样做,而不必重写以前的开发人员所做的一切。在这一点上,我只是想解决眼前的问题。

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


【解决方案1】:

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

你应该这样做

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

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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2013-12-20
    • 2011-06-06
    • 1970-01-01
    • 2023-04-09
    • 2011-06-18
    • 2020-11-08
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多