EF Code First - WithMany()

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告诉一个多一对多的关系之间UserRole存在...

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)


Tom*_*han 5

请注意,导航属性的选择位于目标的另一侧.

让我们看一个例子,即使这个特定情况可能不是我的观点的完美插图......如果你想跟踪数学测试,并重复使用问题,你可能有两个表(TestsQuestions)有一个表多对多的关系; 每个测试都有几个问题,每个问题都可以出现在几个测试中.但是,您可能不需要获得特定问题所针对的测试集合 - 即使您知道问题可以出现在多个测试中,您也不会对其感兴趣.
因此,.WithMany()在声明这一点时使用重载,因此您获得了一个导航属性来获取test(theTest.Questions())的问题,但是没有导航属性的另一种方式(theQuestion.Tests()).但是你仍然需要一个多对多的关系,因为测试和问题可以有很多其他的.
我同意在这个特定的情况下,这个设置可能没有意义,但肯定有它的情况,并且在那些情况下,.WithMany()重载让你通过而不定义属性(以及每个属性的lambda表达式)你将会永远不需要.