2014-12-05 47 views
0

幾年前,我和Entity Framework一起工作過,這可能只是我有點生疏。我有分離的實體,而實體又有多個子實體。在我的情況下,它是一個人的實體,每個人都有多個地址。實體框架和一對多的關係不能正確保存

myPerson.FirstName="update first name"; 
//assuming they already have an address in the first entry 
//with appropriate primary keys and foreign key ids, I could do: 
myPerson.Addresses.First().Line1="update line 1"; 
myPerson.Addresses.Add(new Address(){line1="weee",line2="aaaa" postal="12345", type="work"}); 
myDb.Person.Attach(myPerson); 
myDb.Entry(myPerson).State=EntityState.Modified; 
myDb.SaveChanges(); 

當我做這樣的場景時,我得到了我期待的名字。它更新第一個名字,並且如預期的那樣在上面的代碼中實際上將所有其他字段(LastName,Birthday等等)清空。但它不會爲該人創建新地址,也不會更新現有地址。

我不記得它需要數據庫上下文的額外工作才能知道如何更新與上述人員相關的相關實體。在我的谷歌搜索,我似乎聽到的故事,我需要做相當數量的工作從數據庫加載收集,然後去鎮上這樣。我希望事實並非如此。

回答

0

您粘貼這些是行代碼的關鍵部分...

myDb.Person.Attach(myPerson); 
myDb.Entry(myPerson).State=EntityState.Modified; 

第一行會的整個對象圖附加到上下文,並設置每個實體的狀態,此圖不變。第二行代碼將只將根實體的狀態設置爲修改(其他人,如地址實體,將保持未更改狀態)。保存更改後,只會更新單個實體。

當然,這是假定您正在處理斷開連接的實體(使用一個上下文來獲取對象圖,而另一個上下文來執行更新)。我假設你是附在實體上的。

/*咆哮開*/

斷開實體可悲的是自己是不是在EF空間處理得非常好。您會在書籍和博客中找到大量試圖解決斷開連接的實體的示例,但是當您試圖實施更高級的方案(例如包括相關項目集合的對象圖形)時,這些策略會很快崩潰。

/* Rant Off */

+0

感謝您抽出時間發表評論。我回想起上一次做EF的時候,我意識到我處在一個非常不同的場景中。在那個較舊的場景中,我正在對本地sqlite文件執行EF作爲WPF應用程序的數據存儲。所以我在一個本地文件中處於一個富有狀態的環境中,而且我幾乎總是在處理連接的實體而不是分離的實體。 – Danny 2014-12-06 23:10:42

+0

在我當前的場景中,我正在創建一些東西,讓我們的業務邏輯開發人員針對使業務邏輯代碼與實體框架的具體細節分開的接口進行編寫。我們較早的應用程序是由我的前任編寫的,沒有抽象出與業務代碼中使用的不同的ORM,因此我們完全陷入這些應用程序中的一個不同的(並且非常討厭的ORM)。我不想再犯這個錯誤,儘管我懷疑我們會永遠不想從EF那裏改變。太糟糕了,對於分離的實體而言,它必須非常棘手。謝謝。 – Danny 2014-12-06 23:16:44