27

私は 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 が含まれます。

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

4

1 に答える 1

32

得られているのは、データベースへの 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 LoadingRelationship Fixupなどの追加の EF サポートの一部にオプトインします。そのため、一般的には、ナビゲーション プロパティに virtual キーワードを含めることをお勧めします。

于 2010-11-23T01:44:58.973 に答える