如何在entity framework代码中有多对多关联

我刚刚开始使用EF,我观看了一些很棒的教程video。 我坚持以下。

我有一个文件集合的类,我希望这些与事件和/或人有关

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 files {get;set;} public event(){ files = new list();} } public person { public int id {get;set;} public string name {get;set} public virtual ICollection files {get;set;} public person(){ files = new list();} } 

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

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

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

现在,我的猜测是你喜欢在File和Person之间建立多对多的关系,这样每个文件都可以与很多人相关,每个Person都可以有很多文件(同样的Event对象也是如此)。 实现此目的的一种方法是将File类的导航属性指向Event和Person类。 所以,你的模型应该改为:

 public class File { public int Id { get; set; } public string Path { get; set; } public virtual ICollection Events { get; set; } public virtual ICollection Persons { get; set; } } public class Event { public int Id { get; set; } public string EventName { get; set; } public virtual ICollection Files {get;set;} } public class Person { public int Id { get; set; } public string Name { get; set; } public virtual ICollection Files { get; set; } } public class MyContext : DbContext { public DbSet Persons { get; set; } public DbSet Events { get; set; } public DbSet Files { get; set; } } 

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

更新:
将POCO与EF一起使用时,如果将导航属性标记为虚拟 ,则会选择加入一些其他EF支持,如延迟加载关系修复 。 因此通常在导航属性中有一个虚拟关键字被认为是一种很好的做法。