[英]EF Code First Fluent Mapping: 0-1 to Many: HasOptional() 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告訴User
和Role
之間的多對多關系存在......
modelBuilder.Entity<User>()
.HasMany(u => u.Roles)
.WithMany();
...因為默認約定映射會創建一個錯誤的關系,即一對多關系,對應於此映射:
modelBuilder.Entity<User>()
.HasMany(u => u.Roles)
.WithOptional();
請注意,導航屬性的選擇位於目標的另一側 。
讓我們看一個例子,即使這個特定情況可能不是我的觀點的完美插圖......如果你想跟蹤數學測試,並重復使用問題,你可能有兩個表( Tests
和Questions
)有多對多的關系; 每個測試都有幾個問題,每個問題都可以出現在幾個測試中。 但是,您可能不需要獲得特定問題所針對的測試集合 - 即使您知道問題可以出現在多個測試中,您也不會對其感興趣。
因此,在聲明這個時使用.WithMany()
重載,因此您獲得了一個導航屬性來獲取測試的問題( theTest.Questions()
)但沒有另一種方式的導航屬性( theQuestion.Tests()
)。 但是你仍然需要一個多對多的關系,因為測試和問題可以有很多其他的。
我同意在這個特定的情況下,這個設置可能沒有意義,但肯定會有這樣的情況,並且在這些情況下.WithMany()
重載可以讓你在沒有定義屬性的情況下(並且每個屬性都有一個lambda表達式) )你永遠不需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.