簡體   English   中英

重新加載時的實體框架5 InvalidOperationException

[英]Entity Framework 5 InvalidOperationException on Reload

我嘗試使用重載功能放棄一些更改。 我收到一個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。 有關正確報告更改的信息,請參閱Entity Framework文檔。

編輯:
我已經啟用和禁用ProxyCreationEnabledLazyLoadingEnabled
也嘗試了不同的方法。 所有這些嘗試都會引發相同的異常。

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


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

希望我能找到解決方案。 不想處置完整的DbContext來重新加載所有數據。

引用此MSDN線程/帖子

“值得注意的是,無論是否使用通過代理類的更改跟蹤或顯式調用entermemberchanged的錯誤,都會顯示該錯誤。每當我執行entitymemberchanging並在創建objectcontext / objectstatemanager的線程之外進行更改時,我似乎都會收到錯誤,無論我是同步還是異步執行這兩個函數,使用鎖還是讓線程顯式休眠,這在我看來都是對象狀態管理器的某種“真正的錯誤”,而不是簡單的事情解決方法。鮑爾在您的法庭上,MSFT。”

附注:評論時間太長。

如果代碼是您發布時的代碼,即從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

希望這對某人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM