C# EF代码优先-WithMany()

C# EF代码优先-WithMany(),c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我最近参加了ManyNavigationPropertyConfiguration ,在该类中,我发现了一个名为WithMany()的方法,其中包含2个重载 第一个过载: WithMany() 将关系配置为 很多:很多没有导航 位于另一侧的属性 关系 第二个过载: WithMany(表达式) 将关系配置为 多个:具有导航属性的多个 在关系的另一边 现在是我的问题,为什么要将关系配置为多:多而没有导航属性(第一个重载)?我不认为这会有什么帮助。。。有什么想法吗?请注意,导航属性的选择位于目标的另一

我最近参加了
ManyNavigationPropertyConfiguration
,在该类中,我发现了一个名为
WithMany()
的方法,其中包含2个重载

第一个过载:
WithMany()

将关系配置为 很多:很多没有导航 位于另一侧的属性 关系

第二个过载:
WithMany(表达式)

将关系配置为 多个:具有导航属性的多个 在关系的另一边


现在是我的问题,为什么要将关系配置为多:多而没有导航属性(第一个重载)?我不认为这会有什么帮助。。。有什么想法吗?

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

让我们看一个例子,尽管这个具体案例可能不是我观点的完美插图。。。如果您想跟踪数学测试并重复使用问题,您可能有两个表(
测试
问题
),它们具有多对多关系;每个测试有几个问题,每个问题可以出现在几个测试中。但是,您可能永远不需要获得一组特定问题的测试,即使您知道问题可能出现在多个测试中,但您对其中的一个不感兴趣。
因此,在声明时使用
.WithMany()
重载,因此您可以获得一个导航属性来获取测试的问题(
test.questions()
),但没有其他导航属性(
theQuestion.Tests()
)。但是您仍然需要多对多的关系,因为测试和问题都可能有许多其他的关系。

我同意,在这种特定情况下,这种设置可能没有意义,但在某些情况下确实有意义,在这种情况下,
.WithMany()
重载可以让您不必定义您永远不需要的属性(以及每个属性的lambda表达式)。

此模型可能就是一个例子:

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; }
}
。。。因为默认约定映射将创建与此映射对应的错误关系,即一对多关系:

modelBuilder.Entity<User>()
            .HasMany(u => u.Roles)
            .WithOptional();
modelBuilder.Entity()
.HasMany(u=>u.Roles)
.WithOptional();
modelBuilder.Entity<User>()
            .HasMany(u => u.Roles)
            .WithMany();
modelBuilder.Entity<User>()
            .HasMany(u => u.Roles)
            .WithOptional();