3

次の関係のマッピングに混乱しています。

次の 3 つの関連エンティティがあります: 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.

両方のエンティティ間でマッピング テーブルを再利用したいのですが、どうすればよいですか?

4

2 に答える 2

3

使用するマッピングは、ジャンクション テーブル ( UserGroups) が概念 (クラス) モデルの一部ではない状況を対象としています。このような状況Userでは、 が必要でありList<Group>Groupが必要List<User>です。(補足:使用ICollection<>をお勧めします)。

しかし、あなたはclass GroupUserあなたのモデルを持っているので、それはすでにマップされています (どうやら別の場所にマップしたようUserGroupsです)。

あなたの場合、ジャンクション テーブルを概念モデルにプルすることは正当化されます。これは、接続するテーブルへの 2 つの 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

You can't, a great description can be found here

Currently I have used Entity Splitting if my model is one to one but other wise you cant map two models to the same table.

于 2013-06-18T03:43:30.740 に答える