9


6

Code-First EF4の多対多の関係

EF4 Code-First CTP3で多対多の関係をどのように表現しますか?

たとえば、次のクラスがある場合:

class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection Profiles { get; set; }
}

class Profile
{
    public int Id { get; set; }
    public string Name { get; set; }
}

データベースには、ユーザーのFKとプロファイルのFKを持つUserProfilesテーブルがあります。 これをどのようにマップできますか?

編集:現在、 Profile`に ICollection`プロパティを設定してマップする方法を理解していますが、「Users have many profiles」と指定する必要があるときに反対のナビゲーションプロパティを設定したくありません。

2 Answer


8


編集:CTP4は昨日遅くリリースされ(2010年7月14日)、現在サポートされています:

modelBuilder.Entity()。HasMany(p ⇒ p.Tags).WithMany();

'' '' '

_finally_が、これが現在可能でないことを発見しました。 Microsoftはこの機能を追加しようとしています(1つのナビゲーションプロパティのみ)。

詳細については、MSDNフォーラムの次のリンクを参照してください。http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/6920db2b-88c7-4bea-ac89-4809882cff8f


5


多対多の関係では、両側にナビゲーションプロパティを含め、それらを仮想化する必要があります(遅延読み込みを利用するため)

class User
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual ICollection Profiles { get; set; }
}

class Profile
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual ICollection Users { get; set; }
}

次に、そのセットアップを使用して、多対多の関係を定義できます(エンティティフレームワークにそれを行わせることもできますが、使用する命名規則は好ましくありません)。

        modelBuilder.Entity().
            HasMany(p => p.Users).
            WithMany(g => g.Profiles).
            Map(t => t.MapLeftKey("ProfileID")
                .MapRightKey("UserID")
                .ToTable("UserProfiles"));

これにより、UserIDとProfileIDをキーとして持つUserProfilesという名前のテーブルが作成されます。