Asp.net 实体框架上下文的解决方法。刷新错误?
我在使用EF4和自引用表(实现邻接列表层次结构)时遇到问题。Asp.net 实体框架上下文的解决方法。刷新错误?,asp.net,entity-framework-4,objectcontext,Asp.net,Entity Framework 4,Objectcontext,我在使用EF4和自引用表(实现邻接列表层次结构)时遇到问题。 注意:不是多对多引用,只是一张表上的一对多引用。 尝试使用上下文解决间歇性InvalidOperationException(“…ObjectContext可能处于不一致的状态…”)。由于EF4中存在明显的错误,刷新失败 在前面的帖子中,我从Shimmy的connect.microsoft.com链接中看到,漏洞仍然存在。 有人能推荐一种解决方法吗? 如果数据库和实体框架不同步,您该怎么办? 编辑 更多可能有用的事实: 当我收到Inv
注意:不是多对多引用,只是一张表上的一对多引用。
尝试使用
上下文解决间歇性InvalidOperationException
(“…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
保持不变。它不会被(不正确的)数据库值更新
现在我想,好吧,这看起来很奇怪,但如果我再次保存,db可能会被更正
从catch
内部调用后续的Context.SaveChanges()
仍然不会更新数据库。(但这次不会抛出异常。)
如果我对SetParent方法进行新调用,
myObj=Context.MyObjects.SingleOrDefault(o=>o.Id==Id)
,
将对象的ParentId
参数正确填充为1,即数据库中的值
此外,对于giggles,我将对象的ParentId
设置为它自己的Id,而不是null,以表示无父性。这工作正常,不会导致无效操作异常
。但是,由于其他原因,这是一个PITA。例如,对象报告其自身为额外子对象。
因此,问题是:
- 尝试设置我的自参考
int是什么意思?ParentId
设置为null,是否会导致异常
- 为什么数据库在异常之前没有得到更新
- 为什么在
catch
中,我不能重新同步李>
通过上下文从数据库中重新查询对象
编辑-响应您的更新,如果您在上下文中提交对象的更改,则会发生错误,使用相同的上下文很可能是问题所在。尝试在catch中重新创建上下文以重新查询和更新,看看是否效果更好。Brian,在catch中重新创建上下文似乎是重新同步问题的答案。非常感谢。我仍然不知道问题为什么会首先出现,但至少现在我可以继续我的生活了对象上下文是一个工作单元;它保留了同步到数据库所需的所有更改。因此,在catch中,它可能仍然试图将出错对象推送到数据库中。即使您重新查询,如果先前查询的对象存储在其内部状态,OC也会返回该对象。