实体框架Context.Refresh错误的解决方法?

时间:2011-01-07 14:36:53

标签: asp.net entity-framework-4 objectcontext

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

尝试使用InvalidOperationException解决间歇性Context.Refresh(“ ... ObjectContext可能处于不一致状态... ”)由于EF4中的明显错误而失败。

我看到,在上述帖子中关注Shimmy的connect.microsoft.com链接后,该错误仍未解决。
任何人都可以推荐一种解决方法吗? 如果您的数据库和实体框架不同步,您会怎么做?

修改
更多可能有用的事实:

  1. 当我收到InvalidOperationException并且消息显示“数据库的更改已成功提交...”时,情况并非如此。他们不是。 我尝试将对象的ParentId从1更改为null(ParentId类型int?。)
  2. 我的对象的ParentId属性已正确更改为预期值(null)。我打电话给Context.SaveChanges()。然后,抛出异常。我检查了数据库,并且值已更新。在这种情况下,ParentId在数据库中仍为1。
  3. catch内,如果我尝试通过
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)重新查询对象,则对象的ParentId保持不变。它不会被(不正确的)数据库值更新!
    现在我想,好吧,这看起来很奇怪,但也许如果我再次保存,数据库将被纠正。
  4. Context.SaveChanges()内部调用后续catch仍然不会更新数据库。 (但这一次,不会抛出异常。)
  5. 如果我对我的SetParent方法进行新的调用,
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
    将对象的ParentId参数正确填充为1,即数据库中的值。
  6. 此外,对于咯咯笑,我将对象的ParentId设置为它自己的Id,而不是null,以表示无父对象。这很好,并没有导致InvalidOperationException。但是,出于其他原因,这是一个PITA。例如,该对象报告自己是一个额外的孩子。

    所以,问题是:

    • 尝试将自引用int? ParentId设置为null导致异常是什么意思?
    • 为什么db在异常之前没有得到更新?
    • 为什么,在catch内,我不能重新同步?!

1 个答案:

答案 0 :(得分:1)

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

编辑 - 为了响应您的更新,如果您在上下文中提交对象的更改,则会发生错误,使用相同的上下文最有可能是问题。尝试重新创建catch中的上下文以重新查询和重新更新,并查看它是否更好。