EF Code First - WithMany()

时间:2011-05-08 11:56:53

标签: c# entity-framework ef-code-first

我最近来到班级ManyNavigationPropertyConfiguration<TEntity, TTarget> 在那个类中,我发现了一个名为WithMany()的方法,有2个重载。

第一次过载: WithMany()

  

配置关系   很多:很多没有导航   在另一边的财产   关系。

第二次过载: WithMany(Expression<Func<TTarget, ICollection<TEntity>>>)

  

配置关系   很多:许多具有导航属性   在这段关系的另一边。

现在是我的问题,为什么你要将关系配置为很多:许多没有导航属性(第一次重载)?我没有看到任何有用的场景......有什么想法吗?

2 个答案:

答案 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 UserRole之间的多对多关系......

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表达式)他们你永远不需要。