重载时的InvalidOperationException

本文关键字:InvalidOperationException 重载 | 更新日期: 2023-09-27 18:05:22

我尝试放弃重载函数的一些更改。我得到一个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 on就调用了EntityMemberChanged或EntityComplexMemberChanged具有相同属性名称的相同更改跟踪器。的信息关于正确报告变更,请参见实体框架文档。

编辑:


我已经启用和禁用了ProxyCreationEnabled, LazyLoadingEnabled
我也尝试了不同的方法。所有这些尝试都会抛出相同的异常。

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


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

希望我能找到解决办法。不想释放整个DbContext来重新加载所有数据。

重载时的InvalidOperationException

引用MSDN线程/post

值得注意的是,无论您是通过代理类使用更改跟踪还是显式调用entitymemberchanged,都会显示错误。每当我执行entitymemberchanging并在创建objectcontext/objectstatemanager的线程之外的线程上更改时,我似乎都会得到错误,无论我是否同步或异步执行这两个函数,使用锁或让线程显式睡眠。在我看来,这是objectstatemanager的某种"真正的bug",而不是简单的解决方法。看你的了,微软。"

注:注释太长

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

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

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

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

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

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

在使用

从上下文中删除实体之前,我只是删除了处理程序
MyEntity.PropertyChanged -= MyPropertyChangedHandler;
context.MySet.Remove(MyEntity); //it works after removing the handler

相关文章:
  • 没有找到相关文章