我使用 EF4 和自引用表(实现邻接列表层次结构)遇到了这个问题。
注意:不是多对多引用,只是单个表上的一对多。由于 EF4 中的明显错误,尝试使用失败
解决间歇性InvalidOperationException(“ ...ObjectContext 可能处于不一致状态... ”) 。Context.Refresh
在上述帖子中,我从 Shimmy 的 connect.microsoft.com 链接中看到,该错误仍然很突出。
任何人都可以推荐一个解决方法吗?
如果您的数据库和实体框架不同步,您会怎么做?
编辑
一些可能有帮助的事实:
- 当我收到
InvalidOperationException消息并显示“对数据库的更改已成功提交...”时,这是不正确的。他们不是。我试图将对象的ParentId从 1 更改为 null (ParentId类型int?)。 - 我的对象的
ParentId属性已正确更改为预期值(null)。我打电话Context.SaveChanges()。然后,抛出异常。我检查了数据库,但该值尚未更新。在这种情况下,ParentId在数据库中仍然是 1。 - 在 内部
catch,如果我尝试通过 重新查询对象
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id),
则对象ParentId保持不变。它不会被(不正确的)数据库值更新!
现在我想,好吧,这看起来很奇怪,但也许如果我再次保存,数据库将得到纠正。 Context.SaveChanges()从内部调用后续catch仍然不会更新数据库。(但这一次,没有抛出异常。)- 如果我对我的 SetParent 方法进行新调用,
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)则将
对象的参数正确地填充ParentId为 1,即数据库中的值。
此外,为了咯咯笑,我将对象设置ParentId为它自己的 Id,而不是 null,以表示没有父母。这工作正常,并没有导致InvalidOperationException. 但是,由于其他原因,它是一个 PITA。例如,对象报告将自己作为额外的孩子。
所以,问题是:
- 尝试将我的自引用设置
int? ParentId为导致异常的 null 是什么? - 为什么数据库在异常之前没有更新?
- 为什么,在里面
catch,我不能重新同步?!