ebb*_*ebb 13 c# entity-framework ef-code-first
我最近来到了这个班级ManyNavigationPropertyConfiguration<TEntity, TTarget>
,在那个班级里我发现了一个名为WithMany()2重载的方法.
第一次过载:
WithMany()
将关系配置为很多:很多在关系的另一侧没有导航属性.
第二次过载:
WithMany(Expression<Func<TTarget, ICollection<TEntity>>>)
将关系配置为多个:许多关系的另一侧具有导航属性.
现在是我的问题,为什么你要将关系配置为很多:许多没有导航属性(第一次重载)?我没有看到任何有用的场景......有什么想法吗?
Sla*_*uma 36
一个例子可能是这个模型:
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; }
}
Run Code Online (Sandbox Code Playgroud)
如果您从不想检索具有特定角色的所有用户,请添加导航属性...
public ICollection<User> Users { get; set; }
Run Code Online (Sandbox Code Playgroud)
...对Role班级来说是不必要的开销.
但你还是必须EF告诉一个多一对多的关系之间User和Role存在...
modelBuilder.Entity<User>()
.HasMany(u => u.Roles)
.WithMany();
Run Code Online (Sandbox Code Playgroud)
...因为默认约定映射会创建一个错误的关系,即一对多关系,对应于此映射:
modelBuilder.Entity<User>()
.HasMany(u => u.Roles)
.WithOptional();
Run Code Online (Sandbox Code Playgroud)
请注意,导航属性的选择位于目标的另一侧.
让我们看一个例子,即使这个特定情况可能不是我的观点的完美插图......如果你想跟踪数学测试,并重复使用问题,你可能有两个表(Tests和Questions)有一个表多对多的关系; 每个测试都有几个问题,每个问题都可以出现在几个测试中.但是,您可能不需要获得特定问题所针对的测试集合 - 即使您知道问题可以出现在多个测试中,您也不会对其感兴趣.
因此,.WithMany()在声明这一点时使用重载,因此您获得了一个导航属性来获取test(theTest.Questions())的问题,但是没有导航属性的另一种方式(theQuestion.Tests()).但是你仍然需要一个多对多的关系,因为测试和问题可以有很多其他的.
我同意在这个特定的情况下,这个设置可能没有意义,但肯定有它的情况,并且在那些情况下,.WithMany()重载让你通过而不定义属性(以及每个属性的lambda表达式)你将会永远不需要.