得られているのは、データベースへの 1 対多の関連付けのマッピングに関する EF Code First の既定の動作です。たとえば、ICollection<File>on Person クラスがあるとします。その結果、EF は Files テーブル (PersonId) に FK を作成し、それを Persons テーブルの Id PK にマップします。
ここで、 File と Person の間に多対多の関係を持たせたいので、各ファイルは多くの 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 を使用する場合、ナビゲーション プロパティを仮想としてマークすると、 Lazy LoadingやRelationship Fixupなどの追加の EF サポートの一部にオプトインします。そのため、一般的には、ナビゲーション プロパティに virtual キーワードを含めることをお勧めします。