【问题标题】:How to associate one table to many parents using EF Code First如何使用 EF Code First 将一个表关联到多个父级
【发布时间】:2012-10-18 18:19:02
【问题描述】:

我正在构建一个域模型,该模型需要多个表才能被多个可能的父表引用。像您这样的东西可能有一个表来存储笔记或文件,并且这些笔记和/或文件可以与不同的父实体相关联。并不是说同一个“文件”或“笔记”可以与多个所有者相关联,而是“文件”表中的 10 行,其中 3 行可能由“客户”表中的行拥有,其中 3 行可能是由“Orders”表中的行拥有,其中 4 个可能由“Person”表中的行拥有。

拥有的表都有子表的虚拟 ICollections。

当我通过代码首次迁移运行我的模型以进行初始迁移并查看生成的流畅代码时,这些表的表定义包含多个引用回源表的 id 列,因此会有一个列“customer_id”、“person_id”等(每个可能的“拥有实体”列。这似乎不太“正确”。有没有更好的方法在 EF 中使用 CodeFirst 对此进行建模?就像能够使用子表中的鉴别器列提供有关拥有实体的“提示”?

谢谢, -MrB

【问题讨论】:

    标签: entity-framework ef-code-first entity-framework-migrations


    【解决方案1】:

    如果您在便笺和所有可以拥有便笺的实体之间创建多对多关系,您将为每种拥有类型创建一个联结表和一个漂亮而干净的便笺表。创建多对多关系的最简单方法是覆盖DbContext.OnModelCreating 方法。

    你的 DbContext:

      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; }
      }
    

    这将生成以下表格:CustomerOrdersNotesCustomerNotesOrderNotes 最后两个是联结表,每个只有两列。

    注意!使用此解决方案,实体也可以共享笔记,例如Customer 和 Order 可以拥有同一个 Note。

    【讨论】:

      【解决方案2】:

      不确定是否合适,但您可以使用 EF 层次结构来做到这一点。见这篇文章:

      http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

      基本上,您的笔记可以有三种类型,它们都继承自基本笔记类型。

      EF 中有三种类型的层次结构,所以它是一篇三部分的文章...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 2012-01-19
        • 1970-01-01
        相关资源
        最近更新 更多