3

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

我有以下三个相关实体:User, Group, GroupUser.

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.

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

4

2 回答 2

3

您使用的映射适用于联结表 ( UserGroups) 不是概念(类)模型的一部分的情况。在这种情况下User应该有一个List<Group>并且Group应该有一个List<User>。(旁注:ICollection<>建议使用)。

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

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

如果您想获得Groupa 的 s,User则必须使用类似的查询

var groups = context.Users.Where(u => u.UserId == 1)
                    .SelectMany(u => u.Groups)
                    .Select(ug => ug.Group)
于 2013-06-18T09:04:21.340 回答
1

你不能,一个很好的描述可以在这里找到

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

于 2013-06-18T03:43:30.740 回答