我使用EF4和自引用表(实现邻接列表层次结构)遇到了this问题。
注意:不是多对多参考,只是一张桌子上的一对多。
尝试使用InvalidOperationException
解决间歇性Context.Refresh
(“ ... ObjectContext可能处于不一致状态... ”)由于EF4中的明显错误而失败。
我看到,在上述帖子中关注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
仍然不会更新数据库。 (但这一次,不会抛出异常。)myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
,ParentId
参数正确填充为1,即数据库中的值。此外,对于咯咯笑,我将对象的ParentId
设置为它自己的Id,而不是null,以表示无父对象。这很好,并没有导致InvalidOperationException
。但是,出于其他原因,这是一个PITA。例如,该对象报告自己是一个额外的孩子。
所以,问题是:
int? ParentId
设置为null导致异常是什么意思?catch
内,我不能重新同步?!答案 0 :(得分:1)
通过上下文从数据库中重新查询对象...
编辑 - 为了响应您的更新,如果您在上下文中提交对象的更改,则会发生错误,使用相同的上下文最有可能是问题。尝试重新创建catch中的上下文以重新查询和重新更新,并查看它是否更好。