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。

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

4

1 回答 1

32

您得到的是 EF Code First 在将 1 到多关联映射到数据库方面的默认行为。例如,您有一个ICollection<File>on 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)以将这些多对多关联映射到数据库。

更新:
当使用带有 EF 的 POCO 时,如果您将导航属性标记为虚拟,您将选择加入一些额外的 EF 支持,例如延迟加载关系修复。所以一般来说在导航属性中有一个虚拟关键字被认为是一种很好的做法。

于 2010-11-23T01:44:58.973 回答