2016-07-29 77 views
2

我需要在一個請求中刪除並添加具有相同主鍵值的實體,任何人都可以向我推薦解決方案嗎?實體框架:在一個請求中刪除並添加具有相同密鑰的實體

以下是我的示例代碼,其中給出了錯誤:違反PRIMARY KEY約束'PK_Table'。不能在對象'dbo.Table'中插入重複鍵。

context.Set<Entity>().Attach(existingEntityObj); 
Entry(existingEntityObj).State = EntityState.Deleted; 

context.Set<Entity>().Add(newEntityObj); 
context.Entry<Entity>(newEntityObj).State = EntityState.Added; 

context.SaveChanges(); 

假設兩個物體(existingEntityObj和newEntityObj)具有在主鍵屬性相同的值。

在此先感謝!

+1

你將不得不放棄主鍵約束,刪除你的實體,添加你的實體,並添加主鍵約束。但是,當FK引用它時,您不能刪除主鍵約束。你在做什麼聽起來像一個壞主意。你能不能用新對象的數據修改現有的對象? – Pakman

回答

2

您需要執行兩次SaveChanges()調用才能完成此工作。這裏的問題在於,雖然看起來您首先刪除了記錄並添加了新記錄,但框架實際上是先插入記錄。

原因是因爲實體框架並不能讓您精確控制操作發生的順序。所以最好的辦法是將兩者包裝在單獨的TransactionScope中,這將允許您控制單個事務發生。

你可以在這裏閱讀更多:https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

+0

與交易示例相似的答案https://stackoverflow.com/questions/2600688/clear-an-entitycollection-and-then-add-to-it-within-the-same-transaction-doesnt/2601143#2601143 –

2

一個更新語句可以爲你工作,所以解決的辦法就是更新舊實體的新的實體價值,如果你想保持相同的主鍵值。當主鍵標識一個實體時,刪除一個實體並添加一個新實體代替實體會產生與更新相同的效果。

糾正我,如果你覺得我錯了,給我一個完美的例子。

相關問題