自跟踪實體 - AcceptChanges無法繼續,因為對象的鍵值與ObjectStateManager中的另一個對象衝突

entity-framework objectcontext self-tracking-entities wcf

我已經被這個問題困住了一個多星期了。希望有人能指出我正確的方向。

我首先簡要介紹一下我的架構。

資產1 ---> 1地址* - > 1區* - > 1區* - > 1國家

套餐1 - > *資產

使用自我跟踪實體(STE)+ WCF。

腳步:

  1. 調用數據存儲以獲取資產列表。
  2. 調用數據存儲以獲取包列表。
  3. 用戶選擇一個包並為其分配一些資產。
  4. 保存包裹。

在步驟2中,呼叫使用預先加載的地址。

from p in context.Assets.Include("Address.Area.Region.Country")

這是嘗試呼叫時的錯誤

context.Packages.ApplyChanges(package)

AcceptChanges無法繼續,因為對象的鍵值與ObjectStateManager中的另一個對象衝突。在調用AcceptChanges之前,請確保鍵值是唯一的。

編輯

在窺探之後,我發現這是一個STE問題。問題是您無法持久存儲包含此處概述的同一實體的多個實例的圖形。這是我的問題。

如何將實體添加到我的實體集合中。新實體可能具有包含與集合中已有密鑰相同的密鑰的相關實體。即添加可能包含相同地址,區域,地區或國家/地區實體的新資產。

這是我的約束:

  1. 我必須使用導航集合,因為它會影響UI。
  2. 我無法預先獲取將涉及的所有實體,因為數據集太大了。
  3. 我必須能夠隨時拍攝實體的快照以保留歷史記錄並使用它來“撤消”任何更改。

我知道Diego B Vega建議的可能解決方案,但這些不是我可以用於我的解決方案的選項。有沒有人有任何其他想法?

一般承認的答案

僅供參考,我寫了一篇博文,對我在EF論壇中已經回复的內容提出了一些額外的建議。 是博客文章。


熱門答案

如果你知道我的意思,你有沒有考慮放棄ORM-s並恢復正常訪問:-)

不開玩笑 - 當你像一個問題(比起其他任何東西聞起來像ORM臭蟲)那樣摔跤時你可以推出自己的5-10函數來進行正常的sproc調用和更簡單的數據類型轉換然後你現在又回到完全控制狀態,並且不會被圖書館所困擾,這些圖書館將會像5年一樣穩定下來。

特別是因為你似乎有非常乾淨的架構 - 意味著非常簡單的查詢和直接的更新。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因