2012-10-18 48 views
3

我正在构建一个领域模型,该模型需要几个表才能够由多个可能的父表引用。像你这样的东西可能有一个表来存储笔记或文件,这些笔记和/或文件可以与不同的父实体相关联。不是说可以将多个所有者关联到同一个“文件”或“笔记”,而是将“文件”表中的10行记录归入“客户”表中的行,其中3个可能属于“客户”表中的行,其中3个可能是由“订单”表中的行拥有,其中4个可能由“人”表中的行拥有。如何使用EF代码优先将一个表与多个父代关联

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

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

感谢, -MrB

回答

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

这将产生如下表:客户订单注意CustomerNotesOrderNotes与只有两个,最后两个是结表每列。

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