1

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

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

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

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

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

谢谢

4

1 回答 1

4

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

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

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

您必须从侧面配置多对多关系User,然后WithMany()在不使用 lambda 参数的情况下使用:

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

thisEntityTypeConfiguration<User>在这种情况下是一个。还要注意映射中“左”和“右”的反转。

于 2013-09-05T20:09:15.383 回答