如何使用单向的第一个流畅映射配置多对多关系

时间:2013-09-05 19:34:59

标签: entity-framework many-to-many code-first

我有一个需要多对多关系的User类和Role类。如果User有一个集合或Roles,反之亦然,我可以弄清楚如何在流畅的API中指定映射,例如(在角色映射中):

    this.HasMany(t => t.Users)
        .WithMany(t => t.Roles)
        .Map(m =>
            {
                m.ToTable("UsersToRoles");
                m.MapLeftKey("RoleId");
                m.MapRightKey("UserId");
            });

然而,虽然我确实希望User(类)拥有一组Roles,但我不希望希望Role(类)拥有一组用户,因为通常情况下,每个角色中的用户非常多 - 我不希望访问角色实例的风险可能会导致加载所有这些用户。所以有两个问题:

  1. 我有理由担心吗? (在.edmx的早期,我有记忆问题,虚假的双向关系会导致巨大的性能问题,直到被删除)?

  2. 如果是这样,如果两个类都没有集合,我如何指定多对多关系?

  3. 由于

1 个答案:

答案 0 :(得分:4)

  

我是否有理由担心? (在.edmx的早期,我有记忆问题,造成了虚假的双向关系   在移除之前存在巨大的性能问题)?

如果允许延迟加载,可能存在风险。您可以从virtual集合中删除Role.Users修饰符,以确保永远不会延迟加载此集合,仅限于使用Include(r => r.Users)的显式请求。你在EF 4.0中所说的“虚假的双向关系”可能与包含自动生成关系修正代码的POCO有关,这有时会导致不希望的副作用(但也主要是由于延迟加载)。

  

如果是这样,如果两个类都没有集合,我如何指定多对多关系?

您必须配置User侧的多对多关系,然后使用不带lambda参数的WithMany()

this.HasMany(t => t.Roles)
    .WithMany()
    .Map(m =>
        {
            m.ToTable("UsersToRoles");
            m.MapLeftKey("UserId");
            m.MapRightKey("RoleId");
        });
在这种情况下,

thisEntityTypeConfiguration<User>。另请注意映射中“左”和“右”的反转。