2013-03-01 16 views
23

多対多リレーションシップがあり、Code First Fluent APIを使用して余分なデータをカップルテーブルに格納したいとします。Fluent APIの余分なフィールドを使用した多対多マッピング

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

ユーザーが1個の以上のバッジ(オプション)を持つことができ、バッジは、1人または複数のユーザ(オプション)に属することができます。私は、この関係を保存するための余分なフィールド(Bと呼ばれる)を保存したい。ユーザーID、BadgeId、B

(私はStackOverflowのhereで、この以前のを見てきましたが、私のモデルはやや複雑で、何の答えが正しくまだ与えられていない)

答えて

43

:テーブルには、次のフィールドを持つUserBadges名前を付ける必要がありますそれを多対多として直接マップすることはできません。あなたは、接合テーブルに追加フィールドを追加し、あなたがあなたの代わりにエンティティにごジャンクションテーブルを促進し、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; } 
} 

デフォルトの規約をすべきFluent-APIまたはデータ注釈のいずれかで実行する必要があるUserBadgeテーブルのキーを除いて、マッピングを正しく定義してください。

modelBuilder.Entity<UserBadge>().HasKey(e => new { e.UserId, e.BadgeId }); 
+1

Thxしかし、UserIdとBadgeIdを複合PKとして定義しているため、これが機能するかどうかは疑問です。同じUserIdとBadgeIdを持つ2つのレコードを持つことが可能でなければなりません.B値はそれの別個の値を作成します(別のテーブルへのFKです)。 –

+0

@PatrickPeters:このような場合は、PKを別に定義する必要がありますが、回答のポイントは変わりません。接合テーブルをエンティティとして公開する必要があります。 –

+0

はい、Ladislav、あなたはまったく正しいです。私はあなたの返事に応じてこれを修正し、それは動作します。 –

関連する問題