我得到一個非常奇怪的小故障,我認爲實體框架是怪。以下是正在進行的基本情況。我有一個實體對象Foo,帶有導航屬性集合Bar。在這種情況下,Foo正在通過實體框架更改跟蹤進行跟蹤。 我運行下面的代碼,但結果是很奇怪的c#實體框架改變我的列表內容
var NewBars = CreateBars(); //CreateBars returns a List<Bars> with two items
//After this code is ran, Foo.Bars AND NewBars will both be lists with 4 items.
//I think its because Foo.Bars has dynamic proxies, entity framework edits bars
//To re-insert the overwritten proxies.
Foo.Bars = NewBars;
如果我把一個斷點在VAR NewBars = CreateBars()線,並通過它一步一塊一塊的,一切都會如預期。 Foo.Bars將成爲兩個項目列表,NewBars將成爲兩個項目列表。但是,如果我運行沒有斷點的執行,或者在設置Foo.Bars = NewBars後斷點,那麼這兩個列表奇蹟般地變爲4個項目列表。它對我來說很奇怪,即使是右邊的價值清單也在變化。
有一次,即使當我在斷點處停止執行時,我檢查了新條的內容,第一次查看時是2,然後是我下次查看時是4。它在節目停頓時發生了變化,所以我知道幕後發生了什麼。
問題是,因爲它不斷重新插入代理,我得到主鍵衝突。如果代理不重新插入,那麼一切都很好。我只是想知道,我該如何解決這個問題?我只是想將Foo.Bars設置爲一個新的項目列表。任何方向在這個問題上將不勝感激!謝謝!
嗯,我想我在想什麼是因爲在某些情況下,CreateBars可能會產生已經在列表中,其他時間也許它會生成一個不同的列表。但基本上在任何情況下,我基本上都想寫入數據庫中已有的任何值。然後如果有新的值,只需添加它們。但是我想我總是可以在生成新集之前清除列表 – 2014-11-22 19:29:29
您還可以修改'CreateBars()'來提取現有條目而不是創建新條目使用相同的ID。如果你像'newBar = dbContext.Bars.Find(id)'而不是'newBar = new Bar {... ....}'做一些事情,你不應該在返回的列表中添加結果 – 2014-11-22 20:00:44