我尝试使用重新加载功能放弃一些更改。我得到一个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 具有相同属性名称的相同更改跟踪器。有关信息 关于正确报告更改,请参阅实体框架 文档。
修改
我已启用并停用ProxyCreationEnabled
,LazyLoadingEnabled
尝试了不同的方法。所有这些尝试都抛出相同的异常。
var objContext = ((IObjectContextAdapter)context).ObjectContext;
objContext.Refresh(RefreshMode.ClientWins, entry.Entity);
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
希望我能得到解决方案。不想处置完整的DbContext来重新加载所有数据。
答案 0 :(得分:2)
“值得注意的是,错误显示您是否使用通过代理类进行更改跟踪或显式调用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
希望这有助于某人。