私は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が含まれます。
ユーザーがファイルを人やイベントに添付できるようにしたい。
取得しているのは、データベースへの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サポートの一部にオプトインします。 遅延読み込みおよび関係の修正。したがって、一般に、ナビゲーションプロパティに仮想キーワードを設定することをお勧めします。