27

多対多の関係があり、Code First Fluent APIを使用して、カップルテーブルに追加のデータを保存したいと考えています。

これはどのように達成できますか?

私のモデル:

ユーザーは1つ以上のバッジを持つことができ(オプション)、バッジは1人以上のユーザーに属することができます(オプション)。この関係を保存するために、追加のフィールド(Bと呼ばれる)を保存したいと思います。テーブルには、UserBadgesという名前を付け、次のフィールドを指定する必要があります:UserId、BadgeId、B

(これはStackOverflowで以前に見たことがありますが、モデルはやや複雑で、まだ正しく答えが出ていません)

4

1 に答える 1

47

多対多に直接マッピングすることはできません。ジャンクションテーブルにフィールドを追加し、アプリケーションでそのフィールドにアクセスする場合は、代わりにジャンクションテーブルをエンティティに昇格させ、2つの1対多の関係を使用する必要があります。

public class Badge {
    ...
    public virtual ICollection<UserBadge> UserBadges { get; set; }
}

public class User {
    ...
    public virtual ICollection<UserBadge> UserBadges { get; set; }
}

public class UserBadge {
    public int UserId { get; set; }
    public int BadgeId { get; set; }
    public string B { get; set; }
    public virtual Badge Badge { get; set; }
    public virtual User User { get; set; }
}

UserBadgeFluent-APIまたはデータアノテーションのいずれかで実行する必要があるテーブルのキーを除いて、デフォルトの規則でマッピングを正しく定義する必要があります。

modelBuilder.Entity<UserBadge>().HasKey(e => new { e.UserId, e.BadgeId });
于 2013-03-01T08:33:16.340 に答える