我已經得到了以下要求,在面向對象空間中運行良好,但我似乎無法讓它先使用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代碼的任何想法都是第一優先?
感謝您的回覆。 – Hugo 2011-04-25 17:02:30