2009-12-15 86 views
3

我創建了映射到實體域模型中的實體的POCO域對象。 一切都很好,直到現在,當我必須與多對多的關係工作。實體框架4.0 POCO和多對多問題

假設我有三張桌子。
- 博客
- BlogTag
- 標籤

可以看出,博客和標籤是多到許多與橋臺,BlogTag包含一個外鍵兩個表。

我也有相應的域模型:
- 博客
- BlogsTags
- 標籤

現在,我選擇博客的名單,我試圖從博客訪問特定的標籤。

myBlog.BlogsTags [0] .TAG

BlogTags [0] .TagForeignKey填充,但BlogTags [0] .TAG是 !!

我也打開了LazyLoading。

我會做什麼錯?

謝謝。

好的。這裏有一些源代碼。

我的上下文類

public class MyContext : ObjectContext 
    { 
     public MyContext() : base(Utility.GetConnectionString(...), "containerName") 
     { 
      Blogs = CreateObjectSet<Blog>(); 
      BlogsTags = CreateObjectSet<BlogTag>(); 
      Tags = CreateObjectSet<Tags>(); 

      base.ContextOptions.LazyLoadingEnabled = true; 
     } 

     public ObjectSet<Blog> Blogs { get; private set; } 
     public ObjectSet<BlogTag> BlogsTags { get; private set; } 
     public ObjectSet<Tags> Tags { get; private set; } 
    } 

和我的POCO類只需要通過虛擬關鍵字相關對象的列表。

+0

多一點的代碼可以幫助診斷問題。我可以驗證多對多工作正常。我有許多用戶實體可以有很多角色,反之亦然。 我正在使用存儲庫模式,其中我有一個通用存儲庫,其中包含一個返回活動EF上下文的對象上下文屬性。在EF上下文檢索的構造函數中,我將Lazyloading設置爲true: base.ContextOptions.LazyLoadingEnabled = true; – Jay 2009-12-16 16:37:36

回答

2

BlogTag不應該是一個實體:它只是一種關係,它不包含任何實際的數據。如果關係在數據庫中使用外鍵正確建模,實體模型設計人員應該認識到,並從概念模型消除BlogTag ...


編輯:

我不知道爲什麼懶惰裝載不在這裏工作,但你總是可以使用Include加載Tag明確:

var myBlog = context.Blogs.Include("BlogTags.Tag").First(b => b.Id = blogId); 
var tag = myBlog.BlogsTags[0].Tag; 
+0

假設需要BlogTag(包含更多列),EF會自動計算出它具有其他列並將該實體添加到模型中。對我來說沒有意義的是爲什麼Tag屬性始終爲空。 – 2009-12-15 23:28:49

+0

這不起作用。這是我的方式,但它不會工作。我也意識到,從多人到多人的情況總是如此。那一個屬性總是空的。這聽起來像是一個可能的bug在測試版 – 2009-12-16 17:41:39

0

確保你是在實體訪問關係屬性被定義爲「虛擬」,否則它們不會被自動遍歷。

我有同樣的問題...例如。我的用戶實體的:

public class User : EntityBase 
    { 
     public int UserID { get; set; } 
     public string Username { get; set; } 
     public string Email { get; set; } 
     public virtual List<Role> Roles { get; set; } //VIRTUAL here is KEY! 
} 

我假設你的應該是:

public class Blog 
     { 

    public string Owner { get; set; } 
    public string BlogText { get; set; } 
    public virtual List<BlogTag> BlogTags { get; set; } //VIRTUAL here is KEY! 

    } 
+0

是的,他們已經是虛構的。它需要延遲加載。 – 2009-12-16 21:44:16