2014-11-22 44 views
1

我得到一個非常奇怪的小故障,我認爲實體框架是怪。以下是正在進行的基本情況。我有一個實體對象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設置爲一個新的項目列表。任何方向在這個問題上將不勝感激!謝謝!

回答

1

在分配newBars之前,您想要發生什麼Bar s?Foo.Bars

你需要以某種方式處理它們。它們由數據庫中的Bar表中的行表示,對嗎?

你可以刪除這些舊Bar真完全的東西,如:

dbContext.Bars.RemoveRange(Foo.Bars); 
dbContext.SaveChages(); 

然後分配新的吧:

Foo.Bars = NewBars; 
dbContext.SaveChanges(); 

或者,如果你仍然想老Bar s到在數據庫中存在但只是不能鏈接到Foo那麼你可以這樣做:

Foo.Bars=null; 
Foo.Bars = newBars; 
dbContext.SaveChanges(); 

(當然,這假設你的db模式允許這個沒有違反任何限制)

+0

嗯,我想我在想什麼是因爲在某些情況下,CreateBars可能會產生已經在列表中,其他時間也許它會生成一個不同的列表。但基本上在任何情況下,我基本上都想寫入數據庫中已有的任何值。然後如果有新的值,只需添加它們。但是我想我總是可以在生成新集之前清除列表 – 2014-11-22 19:29:29

+0

您還可以修改'CreateBars()'來提取現有條目而不是創建新條目使用相同的ID。如果你像'newBar = dbContext.Bars.Find(id)'而不是'newBar = new Bar {... ....}'做一些事情,你不應該在返回的列表中添加結果 – 2014-11-22 20:00:44