2011-05-08 107 views
10

我最近來到類ManyNavigationPropertyConfiguration<TEntity, TTarget> ,在那個類中我找到了一個名爲WithMany()的方法,有2個重載。EF代碼第一 - WithMany()

第一過載: WithMany()

配置的關係是 許多:許多而不對 關係的另一側上的導航 屬性。

第二過載: WithMany(Expression<Func<TTarget, ICollection<TEntity>>>)

配置的關係是 許多:許多與所述關係的另一側上的導航屬性 。

現在是我的問題,爲什麼要配置一個關係很多:很多沒有導航屬性(第一個重載)?我沒有看到任何情況下,這將有助於...任何想法?

回答

31

一個例子可能是這種模式:

public class User 
{ 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public ICollection<Role> Roles { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Description { get; set; } 
} 

如果你從不感興趣檢索這是在一個特定的角色所有用戶,添加導航屬性...

public ICollection<User> Users { get; set; } 

...到Role類將是不必要的開銷。

但你還是必須EF告訴UserRole之間的許多一對多的關係存在...

modelBuilder.Entity<User>() 
      .HasMany(u => u.Roles) 
      .WithMany(); 

...因爲默認的約定映射會產生錯誤的關係,即與此映射對應的一對多關係:

modelBuilder.Entity<User>() 
      .HasMany(u => u.Roles) 
      .WithOptional(); 
4

請注意,在目標的另一側導航屬性的選擇爲

讓我們來看一個例子,即使這個具體的例子可能不是我的觀點的完美插圖。如果你想跟蹤數學測試,並重新使用問題,你可能有兩個表(TestsQuestions),它們具有多對多的關係;每個測試都有幾個問題,每個問題都可以出現在幾個測試中。然而,即使您知道問題可能出現在多個測試中,您可能也不需要獲得具體問題的測試集合,但您對哪個問題不感興趣。
因此,您在聲明時使用.WithMany()過載,因此您將獲得導航屬性以獲取測試(theTest.Questions())的問題,但不會以其他方式導航屬性(theQuestion.Tests())。但是你仍然需要一個多對多的關係,因爲測試和問題都可以有很多其他的。
我同意在這個特定的情況下,這種設置可能沒有意義,但肯定會有這種情況,在這種情況下,.WithMany()重載可以讓您無需定義屬性(以及每個屬性的lambda表達式)你永遠不需要。