2012-10-14 58 views
0

我正在使用實體框架從數據庫中檢索博客數據。我有一個「BlogPost」類和一個「作者」類。一位作者可能有許多博客文章,但作者對象本身不包含他們的列表。就作者對象而言,它獨立於所有博客文章。實體框架 - 子對象中的外鍵

Author類的實例作爲BlogPost中的一個屬性包含在內。每個作者都有一個AuthorId。我想從我的數據庫中提取給定的博客,並讓作者對象填充相關數據。我已設法通過在我的博文類中的AuthorID屬性,使用下面的代碼映射對象要做到這一點:

this.HasRequired(t => t.Author).WithMany().HasForeignKey(x => x.AuthorId); 

我想這樣做,但是,是能夠做同樣的事情但不必將AuthorId屬性直接包含在模型中。原因是,因爲作者對象已經包含相應的ID,所以我重複兩次相同的信息。我想沿着這些線路做一些事情:

this.Property(t => t.Author.Id).HasColumnName("id_user"); 
this.HasRequired<TwitterUser>(t => t.Author).WithMany().HasForeignKey(t => t.Author.Id); 

那麼,有沒有什麼辦法不檢索作者子對象,而無需冗餘存儲的AuthorID在博客帖子對象旁邊的作者對象本身?

回答

1

您使用的語法稱爲「外鍵關聯」,並且在EF 4中引入,因爲它解決了一些問題。例如,使用FK關聯時,您可以自動執行級聯刪除。

你可以閱讀更多關於他們在這裏:

http://blogs.msdn.com/b/efdesign/archive/2009/03/16/foreign-keys-in-the-entity-framework.aspx

你仍然可以做的事情老辦法,用簡單的導航性能。但是你需要稍微不同的語法。有一件事是獨立協會要求你在兩端都有導航屬性,並且你說你只需要單向導航。所以你堅持要麼添加一個關聯到你的作者實體,要麼使用FK關聯。

你也可以發現本文由我們自己的拉吉斯拉夫Mrnka有用:

http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef-4/

還要注意,根據EF團隊,獨立的協會可以執行比FK協會差多少,但看來這僅限於View Generation,因此這是一次性啓動成本(每次啓動應用程序或應用程序域時)。另外,對於小的模型,你可能不會注意到它:

http://msdn.microsoft.com/en-us/data/hh949853.aspx

編輯:

正如由@Slauma指出的那樣,你可以通過使用.MAP屬性映射像一個獨立的協會所以:

this.HasRequired(t => t.Author).WithMany().Map(m => m.MapKey("AuthorId")); 
+1

只有一個導航屬性的獨立關聯正常工作。你可以使用'HasRequired(t => t.Author).WithMany()'作爲默認的FK(帶有下劃線,'Author_Id'的東西)或追加'.Map(m => m.MapKey(「AuthorId」 ))'用於映射FK名稱的顯式。 – Slauma

+0

@Slauma - 嗯..有趣的知道。我讀過的所有內容都說獨立關聯需要兩端的導航屬性。 –