6

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

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

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

编辑:
我已经启用和禁用ProxyCreationEnabled, LazyLoadingEnabled.
也尝试了不同的方法。所有这些尝试都会引发相同的异常。

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


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

希望我得到一个解决方案。不想处理完整的 DbContext 以重新加载所有数据。

4

4 回答 4

2

引用这个 MSDN 线程/帖子

“值得注意的是,无论您是通过代理类使用更改跟踪还是显式调用 entitymemberchanged,该错误都会显示。每当我执行 entitymemberchange 并在创建 objectcontext/objectstatemanager 的线程之外的线程上进行更改时,我似乎都会收到错误,无论我是同步还是异步执行这两个函数,使用锁还是让线程显式休眠.在我看来这是objectstatemanager的某种“真正的错误”,而不是简单的东西解决方法。Ball 在你的球场上,MSFT。”

PS 评论太长了。

于 2013-03-25T10:21:21.610 回答
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
于 2013-03-31T19:32:39.217 回答
0

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

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

var entry = DbContext.Entry(entity);
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload();
于 2014-11-04T21:33:03.147 回答
0

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

我只是在从上下文中删除实体之前删除了处理程序

MyEntity.PropertyChanged -= MyPropertyChangedHandler;
context.MySet.Remove(MyEntity); //it works after removing the handler

希望这可以帮助某人。

于 2017-01-26T12:16:39.340 回答