我最近来到班级ManyNavigationPropertyConfiguration<TEntity, TTarget>
在那个类中,我发现了一个名为WithMany()
的方法,有2个重载。
第一次过载:
WithMany()
配置关系 很多:很多没有导航 在另一边的财产 关系。
第二次过载:
WithMany(Expression<Func<TTarget, ICollection<TEntity>>>)
配置关系 很多:许多具有导航属性 在这段关系的另一边。
现在是我的问题,为什么你要将关系配置为很多:许多没有导航属性(第一次重载)?我没有看到任何有用的场景......有什么想法吗?
答案 0 :(得分:35)
一个例子可能是这个模型:
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();
答案 1 :(得分:5)
请注意,导航属性的选择是目标另一侧的。
让我们看一个例子,即使这个特定情况可能不是我的观点的完美插图......如果你想跟踪数学测试,并重复使用问题,你可能有两个表({{ 1}}和Tests
)具有多对多的关系;每个测试都有几个问题,每个问题都可以出现在几个测试中。但是,您可能不需要获得特定问题所针对的测试集合 - 即使您知道问题可能出现在多个测试中,您也不会对其感兴趣。
因此,在声明这一点时使用Questions
重载,因此您获得了一个导航属性来获取测试的问题(.WithMany()
)但没有另一种导航属性(theTest.Questions()
)。但是你仍然需要一个多对多的关系,因为测试和问题都可以有很多其他的
我同意在这种特定的情况下,这种设置可能没有意义,但肯定存在这样的情况,并且在这些情况下theQuestion.Tests()
重载允许您在不定义属性的情况下(并且每个属性的lambda表达式)他们你永远不需要。