簡體   English   中英

EF Code First - WithMany()

[英]EF Code First - WithMany()

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

第一個重載: WithMany()

將關系配置為很多:很多在關系的另一側沒有導航屬性。

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

將關系配置為多個:許多關系的另一側具有導航屬性。

現在是我的問題,為什么你要將關系配置為很多:許多沒有導航屬性(第一次重載)? 我沒有看到任何有用的場景......有什么想法嗎?

一個例子可能是這個模型:

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();

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM