2012-10-30 251 views
8

實體框架5.0先使用現有數據庫編碼。使用電動工具對課程進行逆向設計。一切都很好。數據庫有兩個表。一個父母和一個帶外鍵的孩子回到父母身份。 ID都是自動增量的int。我添加了一些父記錄,現在想要將子記錄添加到特定的父母。我能看到的唯一方法是通過在Parents表中搜索名稱或其他屬性並返回ID來找到適當的父ID。然後在添加子項時在外鍵屬性中使用該ID。我不想創造一個新的父母,所以這是將孩子添加到現有父母的唯一方法嗎?所有的互聯網示例似乎添加一個孩子,並添加一個新的父母,而不是添加一個孩子到現有的父母。任何幫助將不勝感激實體框架 - 添加子實體

+0

要設置相關實體​​,您可以將導航屬性設置爲父實體或設置外鍵。如果你知道這個ID,並且你沒有父節點就是外鍵。如果您有父對象只需設置導航屬性。如果你不知道該ID,也沒有父對象,你怎麼知道該子實體與哪個父母相關? – Pawel

+0

讓我試一試。假設父實體是老師,我在db中有Bob,Julie和Dave。兒童實體是一個教師與多個班級關係的班級。我想向朱莉添加一個班級,但我沒有她的主要ID,因爲它是幾天前我進入她時自動創建的。那麼,我是否必須搜索教師姓名屬性中的「Julie」並返回她的主ID,然後將其用作新類別外鍵? – user1626137

+0

識別Julie的唯一方法是使用ID。原因是ID始終是唯一的,爲什麼名稱不是。您可以使用像context.Teachers.First(t => t.Name ==「Julie」)這樣的代碼從數據庫中引入實體並使用該ID或引用。沒有其他的方式來建立關係,因爲你不知道如何設置關係。另外請注意,Julie可能在此期間被刪除。 – Pawel

回答

22

「朱莉」(萊曼)恰巧是我們的老師之一,當談到英孚。正如她在她的書DbContext中解釋的那樣,在父 - 子關聯,兩個導航屬性(parent.Children,child.Parent)和一個外鍵屬性(child.ParentId)中可以涉及三個屬性。您可以在代碼中設置其中的一個或它們的任意組合。

當EF被觸發以檢測更改(例如,當被調用SaveChanges)它啓動一個稱爲關係修正,其確保三個屬性將在同步過程。

所以,你有三種選擇,以子實體添加到父:

  1. child.Parent = parentObject。父對象應該首先從數據庫中獲取。
  2. parentObject.Children.Add(child)。還需要來自數據庫的預先存在的父對象。
  3. child.ParentId = parentId,對此您只需要知道id。您可以按照您的建議獲取Id,但同樣如此,對於您知道的對象不會被刪除,您可以將其保存在某個變量中以在事務中重複使用它。

使用前兩個選項,子對象不需要手動添加到上下文中。 EF足夠了解這是新的。有了第三個選項,它必須在SaveChanges之前添加到context.Children

+0

我已經將此標記爲答案,並且還指出了Pawel的評論,兩者都證實了我的假設,即我需要父實體或至少是父代ID,然後才能添加子代。附:我擁有Julie的所有書籍和例子,它們在學習Entity Framework的過程中提供了巨大的幫助。 – user1626137