2

我使用 EF4 和自引用表(实现邻接列表层次结构)遇到了这个问题。
注意:不是多对多引用,只是单个表上的一对多。由于 EF4 中的明显错误,尝试使用失败

解决间歇性InvalidOperationException(“ ...ObjectContext 可能处于不一致状态... ”) 。Context.Refresh

在上述帖子中,我从 Shimmy 的 connect.microsoft.com 链接中看到,该错误仍然很突出。
任何人都可以推荐一个解决方法吗?
如果您的数据库和实体框架不同步,您会怎么做?

编辑
一些可能有帮助的事实:

  1. 当我收到InvalidOperationException消息并显示“对数据库的更改已成功提交...”时,这是不正确的。他们不是。我试图将对象的ParentId从 1 更改为 null (ParentId类型int?)。
  2. 我的对象的ParentId属性已正确更改为预期值(null)。我打电话Context.SaveChanges()。然后,抛出异常。我检查了数据库,但该值尚未更新。在这种情况下,ParentId在数据库中仍然是 1。
  3. 在 内部catch,如果我尝试通过 重新查询对象
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
    则对象ParentId保持不变。它不会被(不正确的)数据库值更新!
    现在我想,好吧,这看起来很奇怪,但也许如果我再次保存,数据库将得到纠正。
  4. Context.SaveChanges()从内部调用后续catch仍然不会更新数据库。(但这一次,没有抛出异常。)
  5. 如果我对我的 SetParent 方法进行新调用,
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)则将
    对象的参数正确地填充ParentId为 1,即数据库中的值。

此外,为了咯咯笑,我将对象设置ParentId为它自己的 Id,而不是 null,以表示没有父母。这工作正常,并没有导致InvalidOperationException. 但是,由于其他原因,它是一个 PITA。例如,对象报告将自己作为额外的孩子。

所以,问题是:

  • 尝试将我的自引用设置int? ParentId为导致异常的 null 是什么?
  • 为什么数据库在异常之前没有更新?
  • 为什么,在里面catch,我不能重新同步?!
4

1 回答 1

1

通过上下文从数据库中重新查询对象...

编辑-响应您的更新,如果您在上下文中提交对象的更改,则会发生错误,使用相同的上下文很可能是问题所在。尝试在 catch 中重新创建上下文以重新查询和重新更新,看看是否效果更好。

于 2011-01-07T15:25:48.603 回答