我刚刚开始使用 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。
我希望能够让用户将文件附加到人物和/或事件。
最佳答案
您得到的是 EF Code First 在将一对多关联映射到数据库方面的默认行为。
例如你有一个 ICollection<File>
在 Person 类上,因此,EF 将在 Files 表 (PersonId) 上创建一个 FK,并将其映射到 Persons 表上的 Id PK。
现在,我的猜测是你喜欢在 File 和 Person 之间建立多对多关系,这样每个文件都可以与多个 Person 相关,每个 Person 可以有多个文件(Event 对象的故事与出色地)。实现此目的的一种方法是将导航属性放在指向 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)以将这些多对多关联映射到数据库。
更新:
将 POCO 与 EF 结合使用时,如果您将导航属性标记为虚拟,您将选择加入一些额外的 EF 支持,例如延迟加载 和关系修复。所以一般来说,在导航属性中有一个虚拟关键字被认为是一个很好的做法。
关于c# - 如何在 Entity Framework Code First 中建立多对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251794/