【问题标题】:Not sure how to map many to many relationship - Reuse mapping table different entities不确定如何映射多对多关系 - 重用映射表不同的实体
【发布时间】:2013-06-14 03:38:32
【问题描述】:

我对映射以下关系感到困惑。

我有以下三个相关实体:UserGroupGroupUser

User 包含有关用户帐户的信息,group 包含有关组的信息,GroupUser 包含有关用户在组中的成员身份的信息。

public class User
{
    List<GroupUser> Groups { get; set; }
}

public class Group
{
    List<GroupUser> Users { get; set; }
}

public class GroupUser
{
    Group Group { get; set; }
    User User { get; set; }
    string Position { get; set; }
    DateTime Joined { get; set; }
}

我在User 组中创建了一个单面映射:

        HasMany(x => x.Groups)
        .WithMany()
        .Map(m =>
        {
            m.ToTable("UserGroups");
            m.MapLeftKey("UserId");
            m.MapRightKey("GroupId");
        });

但是,当我尝试在 Group 中再次映射时

        HasMany(x => x.Users)
        .WithMany()
        .Map(m =>
        {
            m.ToTable("UserGroups");
            m.MapLeftKey("GroupId");
            m.MapRightKey("UserId");
        });

我收到以下错误:

Schema specified is not valid. Errors: 
(274,6) : error 0019: The EntitySet 'UserUserGroup' with schema 'dbo' and table 'UserGroups' was already defined. Each EntitySet must refer to a unique schema and table.

我想复用两个实体之间的映射表,我该怎么做?

【问题讨论】:

    标签: entity-framework ef-code-first mapping many-to-many entity-framework-5


    【解决方案1】:

    你不能,可以找到很好的描述here

    如果我的模型是一对一的,目前我已经使用了实体拆分,但否则你不能将两个模型映射到同一个表。

    【讨论】:

      【解决方案2】:

      您使用的映射适用于联结表 (UserGroups) 不属于概念(类)模型的情况。在这种情况下,User 应该有一个List&lt;Group&gt;,而Group 应该有一个List&lt;User&gt;。 (旁注:推荐使用ICollection&lt;&gt;)。

      但是你的模型中有class GroupUser,所以它已经被映射了(显然你把它映射到了其他地方的UserGroups)。

      在您的情况下,将联结表拉入概念模型是合理的,因为它不仅包含与其连接的表的两个 FK。权衡是您无法为多对多关联建模。

      如果您想获得UserGroups,您必须使用类似的查询

      var groups = context.Users.Where(u => u.UserId == 1)
                          .SelectMany(u => u.Groups)
                          .Select(ug => ug.Group)
      

      【讨论】:

      • 感谢 Gert 使用 ICollection 的指针。我最终会走上与您提出的类似的路线,我已经删除了我拥有的映射,并将它们公开为与您所展示的内容类似的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多