实体框架5重新加载时出现InvalidOperationException

时间:2013-03-22 12:07:09

标签: c# entity-framework

我尝试使用重新加载功能放弃一些更改。我得到一个InvalidOperationException。 我该如何防止这种情况?

DbContext.SaveChanges();
//Entity is in Unchanged state
//Make some changes to an entity
//Change state to modified
DbContext.Entry(entity).Reload();
  

出现InvalidOperationException
  在没有首先调用EntityMemberChanging或EntityComplexMemberChanging的情况下调用EntityMemberChanged或EntityComplexMemberChanged   具有相同属性名称的相同更改跟踪器。有关信息   关于正确报告更改,请参阅实体框架   文档。

修改
我已启用并停用ProxyCreationEnabledLazyLoadingEnabled 尝试了不同的方法。所有这些尝试都抛出相同的异常。

var objContext = ((IObjectContextAdapter)context).ObjectContext;
objContext.Refresh(RefreshMode.ClientWins, entry.Entity);


entry.OriginalValues.SetValues(entry.GetDatabaseValues());

希望我能得到解决方案。不想处置完整的DbContext来重新加载所有数据。

4 个答案:

答案 0 :(得分:2)

引用this MSDN thread / post

“值得注意的是,错误显示您是否使用通过代理类进行更改跟踪或显式调用entitymemberchanged。每当我执行entitymemberchanging并且在创建的创建者之外的线程上更改时,我似乎都会收到错误objectcontext / objectstatemanager,无论我是同步还是异步执行这两个函数,都使用锁或让线程明确地睡眠。我发现这是与objectstatemanager的某种“真正的bug”,而不是是一个简单的解决方法。球在你的法庭,MSFT。“

P.S。评论太久了。

答案 1 :(得分:0)

如果代码是您发布的,那么从DbContext加载对象,然后从同一个DbContext重新加载,您不应该明确地将其标记为已修改;对实体进行更改就足以将其标记为已修改。换句话说:

var o = new SimpleObject { Stuff = "One" };
db.SimpleObjects.Add(o);
db.SaveChanges();

o.Stuff = "Two"; // implicitly marks as Modified for you, since it's still Attached

// Unnecessary
//db.Entry(o).State = System.Data.EntityState.Modified;

db.Entry(o).Reload(); // Works for me

答案 2 :(得分:0)

我发现在具有导航属性的代理实体上重新加载失败。

作为解决方法,重置当前值,然后像这样重新加载:

var entry = DbContext.Entry(entity);
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload();

答案 3 :(得分:0)

我有类似的情况,有相同的异常描述。在我的情况下,我试图从上下文中删除一个实体,它与某个仍然被调用的propertychanged处理程序有关。

我刚刚删除了处理程序,然后使用

从上下文中删除了实体
MyEntity.PropertyChanged -= MyPropertyChangedHandler;
context.MySet.Remove(MyEntity); //it works after removing the handler

希望这有助于某人。