我遇到了this问题,使用EF4和一个自我引用表(实现一个邻接表层次结构)。
注意:不是多对多的参考,只是一个表上的一对多。
试图解决间歇InvalidOperationException
(“...的ObjectContext的可能是不一致的状态...”)使用Context.Refresh
失败归因于EF4一个明显的错误。实体框架Context.Refresh错误的解决方法?
我从后面的Shimmy的connect.microsoft.com链接上看到,在上述文章中,该bug仍然非常出色。
任何人都可以推荐一种解决方法吗?
如果数据库和实体框架不同步,你会怎么做?
编辑
一些更多的事实,可以帮助:
- 当我得到了
InvalidOperationException
并有消息称“到数据库的更改已成功提交......”,这不是真的。他们不是。 我试图将对象的ParentId
从1更改为空(ParentId
类型int?
)。 - 我的对象的
ParentId
属性正确更改为期望值(空)。我致电Context.SaveChanges()
。然后抛出异常。我检查了数据库,并且值已经更新了而不是。在这种情况下,数据库中的ParentId
仍然是1。 - 在
catch
的内部,如果我尝试通过myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
,
重新查询对象,则对象的ParentId
保持不变。它不会被(不正确的)数据库值更新!
现在我认为,好吧,这似乎很奇怪,但也许如果我再次保存数据库将被纠正。 - 从
catch
中调用后续Context.SaveChanges()
仍不会更新数据库。 (但是这一次,一个异常没有抛出。) - 如果我做一个新的呼叫我的setparent方法,
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
,
正确地将填充对象的ParentId
参数为1,从数据库中值。
此外,对于笑声,我将对象的ParentId
设置为它自己的Id,而不是null,表示无父母。这工作得很好,并没有造成InvalidOperationException
。但是,由于其他原因,这是一个PITA。例如,对象报告自己是一个额外的孩子。
所以,问题是:
- 是什么样的试图设置我的自我指涉
int? ParentId
为NULL导致异常? - 为什么db在异常之前没有更新?
- 为什么在
catch
里面我不能重新同步?
Brian,重新创建catch中的上下文似乎是resync问题的答案。谢谢。仍然不确定为什么问题首先发生,但至少现在我可以继续我的生活。 :) – 2011-01-13 12:17:33