如何在Entity Framework Code First中实现多对多关联

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。

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


现在数据库和对象模型都准备好了,我该如何处理控制器和视图来添加新的人,并允许用户上传文件并建立文件与人之间的必要关系呢? - user519117
1个回答

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

现在,我猜你希望在File和Person之间建立一个多对多的关系,以便每个文件可以与多个人相关联,每个人也可以拥有多个文件(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; }
}
作为结果,EF将创建链接表(Events_Files和Files_Persons)来将这些多对多关联映射到数据库中。
更新: 当使用带有EF的POCO时,如果将导航属性标记为虚拟的,那么您将选择加入一些额外的EF支持,如延迟加载和关系修复。因此,通常认为在导航属性中具有虚拟关键字是一个好习惯。

我非常确定对于链接表(File类),它应该是"public virtual Events"而不是ICollection。顺便说一下,我知道导航属性,但不知道虚拟关键字。好的提示。谢谢。 - Sleeper Smith
1
当使用上述示例时,创建新关系还会在相关表中添加新项目。因此,在这种情况下,您有一个文件并执行以下操作:File.Events = new Eventlist(其中eventlist填充了从数据库检索的事件),db.savechanges不仅在Events_Files中添加关系记录,而且还在Events表中添加事件。应该如何适当地添加events_files中的关系记录,但不添加额外的记录到events中? - Mounhim
@Mounhim,你应该将这个问题作为一个单独的问题来提出。但同时,我认为你可以尝试使用MyContext.Events.Attach(...) - Charles Prakash Dasari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接