2012-10-18 49 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與只有兩個,最後兩個是結表每列。

注意!利用該解決方案,實體也可以共享筆記,例如,客戶和訂單可以擁有相同的註釋。