首页 文章

如何使用EF Code First将一个表与多个父项关联

提问于
浏览
3

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

拥有表都具有子表的虚拟ICollections .

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

谢谢,-MrB

2 回答

  • 4

    如果您在笔记和可以有笔记的所有实体之间创建多对多关系,您将拥有每个拥有类型的联结表和一个漂亮而干净的笔记表 . 创建多对多关系的最简单方法是覆盖 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 ,最后两个是连接表,每个只有两列 .

    注意!利用该解决方案,实体也可以共享笔记,例如,客户和订单可以拥有相同的票据 .

  • 0

    不确定是否适合,但您可以使用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中有三种类型的层次结构,因此它是一篇三篇文章......

相关问题