Entity framework 如何首先使用EF代码将一个表关联到多个父表

Entity framework 如何首先使用EF代码将一个表关联到多个父表,entity-framework,ef-code-first,entity-framework-migrations,Entity Framework,Ef Code First,Entity Framework Migrations,我正在构建一个域模型,它要求多个表能够被多个可能的父表引用。类似于您可能有一个表来存储注释或文件,这些注释和/或文件可以与不同的父实体相关联。不是同一个“文件”或“注释”可以与多个所有者关联,而是“文件”表中的10行,其中3行可能属于“客户”表中的行,3行可能属于“订单”表中的行,4行可能属于“个人”表中的行 所有表都具有子表的虚拟ICollections 当我在初始迁移的代码优先迁移中运行我的模型,并查看生成的fluent代码时,这些表的表定义包含多个id列,这些id列引用回源表,因此将有一个

我正在构建一个域模型,它要求多个表能够被多个可能的父表引用。类似于您可能有一个表来存储注释或文件,这些注释和/或文件可以与不同的父实体相关联。不是同一个“文件”或“注释”可以与多个所有者关联,而是“文件”表中的10行,其中3行可能属于“客户”表中的行,3行可能属于“订单”表中的行,4行可能属于“个人”表中的行

所有表都具有子表的虚拟ICollections

当我在初始迁移的代码优先迁移中运行我的模型,并查看生成的fluent代码时,这些表的表定义包含多个id列,这些id列引用回源表,因此将有一个列“customer\u id”、“person\u id”等(每个可能的“拥有实体”对应一个)这似乎不太“正确”。有没有更好的方法在EF中使用CodeFirst对此进行建模?比如能够在子表中使用提供有关所属实体的“提示”的鉴别器列

谢谢,
-MrB不确定是否适合,但可以使用EF层次结构。请参阅本文:

基本上,您的笔记可以有三种类型,都是从基本笔记类型继承而来的


EF中有三种类型的层次结构,因此它是一篇三部分的文章…

如果您在notes和所有可以有notes的实体之间创建多对多关系,您将为每个拥有类型创建一个连接表,并创建一个简洁的notes表。创建多对多关系的最简单方法是重写
DbContext.OnModelCreating
方法

您的数据库上下文:

  public class MyDatabase : DbContext
  {
    // Protected methods

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      base.OnModelCreating(modelBuilder);

      modelBuilder.Entity<Customer>().HasMany(x => x.Notes).WithMany();
      modelBuilder.Entity<Order>().HasMany(x => x.Notes).WithMany();
    }

    public MyDatabase() : base("MyDatabase")
    {
    }

    // Properties

    public DbSet<Customer> Customers { get; set; }

    public DbSet<Order> Orders { get; set; }

    public DbSet<Note> Notes { get; set; }
  }
公共类MyDatabase:DbContext { //保护方法 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { 基于模型创建(modelBuilder); modelBuilder.Entity().HasMany(x=>x.Notes).WithMany(); modelBuilder.Entity().HasMany(x=>x.Notes).WithMany(); } 公共MyDatabase():基(“MyDatabase”) { } //性质 公共数据库集客户{get;set;} 公共数据库集命令{get;set;} 公共DbSet注释{get;set;} } 这将生成以下表格:CustomerOrdersNotesCustomerNotesOrderNotes,最后两个是连接表,每个表只有两列

备注!使用此解决方案,实体也可以共享备注,例如,客户和订单可以拥有相同的备注