web-dev-qa-db-ja.com

EntityFrameworkコードで多対多の関連付けを最初に行う方法

私はEFを始めたばかりで、いくつかの素晴らしいチュートリアルビデオを見ました。私は次のことに固執しています。

私はファイルのコレクションのためのクラスを持っています、私はこれらをイベントや人々に結び付けたいです

public class file{
    public int id {get;set;}
    public string path {get;set;}
}

public event {
    public int id {get;set;}
    public string eventname {get;set}
    public virtual ICollection<file> files {get;set;}
    public event(){ files = new list<file>();}
}

public person {
    public int id {get;set;}
    public string name {get;set}
    public virtual ICollection<file> files {get;set;}
    public person(){ files = new list<file>();}
}

データベースを生成すると、ファイルテーブルにPersonIDとEventIDが含まれます。

ユーザーがファイルを人やイベントに添付できるようにしたい。

27
Code Noob

取得しているのは、データベースへの1から多への関連付けのマッピングに関するEFコードファーストのデフォルトの動作です。たとえば、ICollection<File> Personクラスでは、結果として、EFはFilesテーブル(PersonId)にFKを作成し、それをPersonsテーブルのIdPKにマップします。

さて、あなたはファイルと人の間に多対多の関係を持ちたいと思います。そうすれば、各ファイルは多くのPersonと各Personは多くのファイルを持つことができます(Eventオブジェクトについても同じストーリー)。これを実現する1つの方法は、EventクラスとPersonクラスを指すナビゲーションプロパティをFileクラスに配置することです。したがって、モデルを次のように変更する必要があります。

public class File {
    public int Id { get; set; }
    public string Path { get; set; }
    public virtual ICollection<Event> Events { get; set; }
    public virtual ICollection<Person> Persons { get; set; }
}

public class Event {
    public int Id { get; set; }
    public string EventName { get; set; }
    public virtual ICollection<File> Files {get;set;}
}

public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<File> Files { get; set; }
}

public class MyContext : DbContext {
    public DbSet<Person> Persons { get; set; }
    public DbSet<Event> Events { get; set; }
    public DbSet<File> Files { get; set; }
}

その結果、EFはリンクテーブル(Events_FilesおよびFiles_Persons)を作成して、これらの多対多の関連付けをデータベースにマップします。

更新:
EFでPOCOを使用する場合、ナビゲーションプロパティをvirtualとしてマークすると、次のような追加のEFサポートの一部にオプトインします。 遅延読み込みおよび関係の修正。したがって、一般に、ナビゲーションプロパティに仮想キーワードを設定することをお勧めします。

32
Morteza Manavi