首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架5 InvalidOperationException on Reload

实体框架5 InvalidOperationException on Reload
EN

Stack Overflow用户
提问于 2013-03-22 12:07:08
回答 4查看 2K关注 0票数 6

我试着用重新加载函数放弃一些更改。我得到了一个InvalidOperationException。我怎么才能阻止这一切?

代码语言:javascript
复制
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。有关正确报告更改的信息,请参阅实体框架文档。

编辑:

我启用并禁用了ProxyCreationEnabledLazyLoadingEnabled

也尝试过不同的方法。所有这些尝试都会引发相同的异常。

代码语言:javascript
复制
var objContext = ((IObjectContextAdapter)context).ObjectContext;
objContext.Refresh(RefreshMode.ClientWins, entry.Entity);
代码语言:javascript
复制
entry.OriginalValues.SetValues(entry.GetDatabaseValues());

希望我能找到解决办法。不希望将完整的DbContext释放为重新加载所有数据。

EN

回答 4

Stack Overflow用户

发布于 2013-03-25 10:21:21

引用此MSDN线程/ post

“值得注意的是,该错误显示了您是否使用更改跟踪通过代理类或调用已显式更改的实体成员。每当我在创建objectcontext/objectstatemanager的线程外执行实体成员更改和更改时,都会出现错误,无论我是同步还是异步地执行这两个函数,还是使用锁或线程显式休眠。在我看来,这是objectstatemanager的某种”真正错误“,而不是一个简单的解决方法。球在您的领域,MSFT。”

太长时间不能发表评论了。

票数 2
EN

Stack Overflow用户

发布于 2013-03-31 19:32:39

如果代码与您发布的代码一样,对象是从DbContext加载的,然后从同一DbContext重新加载,则不应该显式地将其标记为已修改;对实体进行更改就足以将其标记为已修改的。换言之:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2014-11-04 21:33:03

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

作为一项工作,重置当前值,然后像这样重新加载:

代码语言:javascript
复制
var entry = DbContext.Entry(entity);
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15569914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档