2012-12-20 20 views
2

我們使用C#MVC .NET4。 EF5(CodeFirst)。無基類的EntityFramework和TPT

我們正在嘗試構建一個動態允許用戶將附加屬性「附加」到任何實體的系統。

假設我們有ProductClass和Products。對於每個實體,我們都有一些「標準」字段,但用戶可能決定將任意屬性添加到任何記錄中,如鍵值對,如產品123具有「StockMax」=「10」。我們會創建單個「AttachedProperty」實體/類(在SQL中可以轉換爲PK = {ParentTable,ParentId,PropertyKey}的表) )。這樣我們會爲所有實體的附屬屬性保留一個類(這對建立用戶界面非常有用)。

我知道我可以做到,在EF由具有基礎類:

class EntityWithAttachableProperty { 
      public System.Guid Id {get;set;} 
      public ICollection<MyProperty> MyProperties {get;set;} 
} 

然後從該類繼承我的實體,如:

class Product : EntityWithAttachableProperties { 
     public string name {get;set;} 
    etc 
} 

我的問題是,我不想爲此使用繼承。我將被迫在邏輯上將不相關的事物分組。我也會在SQL中獲得一個我不需要的龐大的EntityWithAttachableProperties表。

那麼,有沒有一種方法可以在沒有基類的情況下完成TPT? (可能通過模型​​構建器)。這樣,我會得到類是這樣的:

class Product { 
    public System.Guid Id {get;set;} 
    public string name {get;set;} 
    public ICollection<MyProperty> MyProperties {get;set;} 
    etc 
} 

class ProductClass { 
    public System.Guid Id {get;set;} 
    public string Classname {get;set;} 
    public ICollection<MyProperty> MyProperties {get;set;} 
    etc 
} 

需要注意的是,當我做到這一點EF試圖PRODUCT_ID和ProductClass_Id添加到MyProperties表。

+0

添加'ID'列以允許表之間的關係。 –

+1

考慮使用NoSql數據庫。使用旨在完成這項工作的適當工具是有益的。 –

+0

@Bob,據我所知,但這意味着我最終會在表中輸入+10 _id列。我想有一個鑑別器。 – rufo

回答

0

如果使用Fluent爲ID列定義映射,它是否有效?我很懷疑EF會允許你定義這個,但是由於這是一個非標準的方法,它不會假設你在這裏試圖做什麼(因此試圖映射到單獨的ID列)。類似於你的DbContext類中的東西(我知道這是不正確的,有人可能會改進):

modelBuilder.Entity<Product>() 
      .HasMany(o=>o.MyProperty) 
      .Map(o=>o.MapKey("Id")); 
+0

我理解你的想法 - 但是,這並不會將辨別器添加到我的可附加屬性表中。此外,甚至不知道如何實現你的想法(新的EF)。謝謝。 – rufo