c# - 如何在 Entity Framework Code First 中建立多对多关联

标签 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 和 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/

相关文章:

entity-framework - 更改表和列名称映射 Entity Framework v4.3

c# - 在 Unity 中运行时将带有文本的按钮动态添加到 UI

c# - 获取角色的替代代码

c# - 如何将实体从一个 Entity Framework 上下文复制到另一个 Entity Framework 上下文?

c# - 一对一无本金依赖EF?

entity-framework - Entity Framework 通用位置

c# - IObjectSet 包含 CompiledQuery 的扩展方法错误

c# - 在 C# 中覆盖 ToString 和使用隐式/显式转换运算符有什么区别?

c# - 小巧玲珑/SQL 服务器 : passing TVP to stored procedure with needed fields only

asp.net - 为什么 Entity Framework 在使用 ADO.NET 实体数据模型映射数据库表时会自动使用 ObjectContext 而不是 DbContext