我刚刚开始使用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。
我希望能够让用户将文件附加到人和/或事件中。
答案 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>的。因此,通常在导航属性中有一个虚拟关键字被认为是一种很好的做法。