2011-01-07 81 views
2

我遇到了this问题,使用EF4和一个自我引用表(实现一个邻接表层次结构)。
注意:不是多对多的参考,只是一个表上的一对多。

试图解决间歇InvalidOperationException(“...的ObjectContext的可能是不一致的状态...”)使用Context.Refresh失败归因于EF4一个明显的错误。实体框架Context.Refresh错误的解决方法?

我从后面的Shimmy的connect.microsoft.com链接上看到,在上述文章中,该bug仍然非常出色。
任何人都可以推荐一种解决方法吗?
如果数据库和实体框架不同步,你会怎么做?

编辑
一些更多的事实,可以帮助:

  1. 当我得到了InvalidOperationException并有消息称“到数据库的更改已成功提交......”,这不是真的。他们不是。 我试图将对象的ParentId从1更改为空(ParentId类型int?)。
  2. 我的对象的ParentId属性正确更改为期望值(空)。我致电Context.SaveChanges()。然后抛出异常。我检查了数据库,并且值已经更新了而不是。在这种情况下,数据库中的ParentId仍然是1。
  3. catch的内部,如果我尝试通过
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
    重新查询对象,则对象的ParentId保持不变。它不会被(不正确的)数据库值更新!
    现在我认为,好吧,这似乎很奇怪,但也许如果我再次保存数据库将被纠正。
  4. catch中调用后续Context.SaveChanges()仍不会更新数据库。 (但是这一次,一个异常没有抛出。)
  5. 如果我做一个新的呼叫我的setparent方法,
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
    正确地将填充对象的ParentId参数为1,从数据库中值。

此外,对于笑声,我将对象的ParentId设置为它自己的Id,而不是null,表示无父母。这工作得很好,并没有造成InvalidOperationException。但是,由于其他原因,这是一个PITA。例如,对象报告自己是一个额外的孩子。

所以,问题是:

  • 是什么样的试图设置我的自我指涉int? ParentId为NULL导致异常?
  • 为什么db在异常之前没有更新?
  • 为什么在catch里面我不能重新同步?

回答

1

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

编辑 - 响应您的更新,如果您有一个范围内的对象提交更改,一个错误发生时,使用同样的情况下最有可能是问题。尝试在捕获中重新创建上下文以重新查询和重新更新,并查看是否更好。

+0

Brian,重新创建catch中的上下文似乎是resync问题的答案。谢谢。仍然不确定为什么问题首先发生,但至少现在我可以继续我的生活。 :) – 2011-01-13 12:17:33