2014-05-14 50 views
3

我在基本層面上很難理解如何在實體框架中管理一對多關係。在我的應用程序中,我有兩個表格,DISPLAY_MASTERDISPLAY_ITEMS。他們的關係就像這樣:如何在Entity Framework中管理一對多關係?

DISPLAY_MASTER.DISPLAY_ID 1 -----> * DISPLAY_ITEMS.DISPLAY_ID

實體框架組織這真的直觀。我留下了一個強類型的DISPLAY_MASTER對象,該對象具有名爲DISPLAY_ITEMSICollection屬性。

我的困惑在於如何將DISPLAY_ITEMS集合保存回數據庫。在我的應用程序中,我正在讀取DISPLAY_ITEMS的所有DISPLAY_MASTER,使用LINQ將其轉換爲名爲_displayItemsList<DISPLAY_ITEMS>對象。然後綁定到DataGrid以使用MVVM進行編輯。用戶可以編輯現有的DISPLAY_ITEMS,刪除現有的DISPLAY_ITEMS,或使用DataGrid添加新的DISPLAY_ITEMS。我的裝訂完美無缺,這些更改反映在_displayItems中。一旦節省時間,我就會停止對自己的代碼感到自信。當用戶點擊保存我設置DISPLAY_MASTERICollection像這樣:

_displayMaster.DISPLAY_ITEMS = _displayItems; 

這是正確的方式來工作的一個實體框架集?或者我應該將DataGrid直接綁定到_displayMaster.DISPLAY_ITEMS對象?或者其他一些方法?我沒有信心的原因是因爲,如果我嘗試驗證使用_displayMaster.DISPLAY_ITEMS實體:

DbEntityValidationResult validationResults = _context.Entry(_displayMaster.DISPLAY_ITEMS).GetValidationResult(); 

我得到一個錯誤說「列表1」是不是集合,這顯然看起來不正確的部分。

任何意見或指導,將不勝感激。

謝謝。

回答

1

這取決於。

  • 如果斷開從他們的數據庫對象的實體,當你將它們綁定到網格(也就是說,如果你在加載實體後處理的情況下,當它涉及到保存更改創建新的上下文),那麼它不是太簡單。您必須從數據庫加載包含舊項目的主數據,並根據網格中新編輯的集合將更改合併到該數據集中,然後保存更改。如何做到這一點的一個例子是here

  • 如果你保持連接到您已加載他們到當用戶在編輯這是容易得多,如果你只是直接綁定_displayMaster.DISPLAY_ITEMS到電網,因爲EF然後可以跟蹤您正在執行的所有變化的背景下,實體在調用SaveChanges時,將對象圖自動收集並更新到數據庫。

既然你標記WPF的問題,你可能第二個選項(取決於您的應用程序的體系結構)。例如,在Web應用程序中,第二個選項根本不存在,因爲所有編輯都發生在與上下文斷開的瀏覽器中。

+0

我確實有第二種選擇,但是我無法直接綁定到實體,因爲它是ICollection類型。當我去編輯'DataGrid'中的記錄時,出現錯誤'EditItem'不可用。我在這裏錯過了什麼嗎? –

+0

@ user3043546:我建議你問一個關於這個後續問題的單獨問題。這聽起來更像是一個WPF綁定主題,而不是EF問題。我在這裏幫不了你,我對WPF不夠熟悉。 – Slauma

+0

感謝您的反饋,您是對的。順便說一下,我做了更多的研究,你的第二個解決方案是要走的路。 –

相關問題