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

时间:2010-11-23 01:06:14

标签: 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>();}
}

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

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

1 个答案:

答案 0 :(得分:32)

您所获得的是EF Code First在将1到多个关联映射到数据库方面的默认行为。 例如,Person类上有ICollection<File>,因此,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; }
}

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

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