6

我已經得到了以下要求,在面向對象空間中運行良好,但我似乎無法讓它先使用ADO EF代碼映射回數據庫。ADO EF代碼第一個泛型中間類繼承映射

我有numrous產品每個將有不同的方面(屬性,但不是在代碼屬性意義上)。例如戒指會有諸如礦物類型=黃金等方面,而鑽石的透明度= VVSI1。

正如你可以看到他們的產品非常大的組成,我想要一個動態的方式來增長我的系統。

因此我創建了一個產品類:

public class Product 
{ 
    public int id { get; set; } 
    public string Name { get; set; } 
    private List<ProductAspect> aspects = new List<ProductAspect>(); 
    public List<ProductAspect> Aspects { get { return aspects; } set { aspects = value; } } 
} 

它ProductAspect列表這是所有環節的基類前進:

public class ProductAspect 
{ 
    public int id { get; set; } 
    public string AspectName { get; set; } 
} 

然後我從繼承ProductAspect使用泛型,使我可以具體(強類型)關於我的縱橫值:

public abstract class ProductAspect<T> : ProductAspect 
{ 
    public T AspectValue { get; set; } 
} 

我然後創建某些方面,讓我來裝飾我的產品:

public class StringAspect : ProductAspect<string> { }; 
public class DecimalAspect : ProductAspect<decimal> { }; 
public class ImageAspect : ProductAspect<byte[]> { }; 

然後我給的DbContext一個嘗試,曾經嘗試都TPH和TPC繼承映射。

似乎都不起作用。 get生成的數據庫模型不會爲Aspect Table的StringAspect或DecimalAspect表創建一個foriegn關鍵字。

public class IxamDataContext : DbContext 
{ 
    public DbSet<Product> Products { get; set; } 
    public DbSet<ProductAspect> Aspects { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     AspectMapping(modelBuilder); 
    } 

    private void AspectMapping(DbModelBuilder mb) 
    { 
     //TPH 
     //mb.Entity<ProductAspect>() 
     // .Map<StringAspect>(m => m.Requires("type").HasValue("sa")) 
     // .Map<DecimalAspect>(m => m.Requires("type").HasValue("da")); 

     //TPC 
     //mb.Entity<StringAspect>().ToTable("StringAspect"); 
     //mb.Entity<DecimalAspect>().ToTable("DecimalAspect"); 
    } 
} 

導致以下異常此播種代碼:

 Product p = new Product(); 
     p.Name = "Diamond"; 
     p.Aspects.Add(new StringAspect() { AspectName = "History", AspectValue = "Old and long" }); 
     p.Aspects.Add(new DecimalAspect() { AspectName = "Weight", AspectValue= 96.5M }); 


     context.Products.Add(p); 
     context.SaveChanges(); 

錯誤時拋出:

的EntityType 'StringAspect' 在EntitySet的 'IxamDataContext.Aspects' 不存在 。參數 name:entity

來自EF代碼的任何想法都是第一優先?

回答

2

實體框架不支持繼承層次結構中的中間非映射類型。這意味着你不能有這個繼承:A(映射) - > B(未映射) - > C(映射)。 EF也不支持映射泛型類型。這意味着您必須從層次結構中刪除通用中間類,並將AspectValue移至具有正確類型的派生類型。

+0

感謝您的回覆。 – Hugo 2011-04-25 17:02:30

0

也許這是爲時已晚,但我會爲您提供使用ComplexType attribute它可以讓你擴展你的類型,如你所願。