我使用 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
,我不能重新同步?!