如何在实体框架代码中有多对多关联

Cod*_*oob 27 c# entity-framework entity-framework-4 ef-code-first

我刚刚开始使用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>();}
}
Run Code Online (Sandbox Code Playgroud)

现在当我生成数据库时,我的文件表有一个PersonID AND EventID.

我希望能够让用户将文件附加到人和/或事件.

Mor*_*avi 32

在将1到多个关联映射到数据库方面,您获得的是EF Code First的默认行为.例如,你有一个ICollection<File>Person类,因此,EF将在Files表(PersonId)上创建一个FK并将其映射到Persons表上的Id PK.

现在,我的猜测是,你想有一个多对多的文件和人之间的关系,使每个文件涉及到许多人,并且每个人都可以有许多文件(Event对象同样的故事也一样).实现此目的的一种方法是将File类的导航属性指向Event和Person类.所以,你的模型应该改为:

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; }
}
Run Code Online (Sandbox Code Playgroud)

因此,EF将创建链接表(Events_Files和Files_Persons)以将这些多个关联映射到数据库.

更新:
当使用波苏斯与EF,如果你标记您的导航属性为虚拟,你会选择加入一些额外的EF的支持像延迟加载关系Fixup时.因此通常在导航属性中有一个虚拟关键字被认为是一种很好的做法.