2015-04-23 75 views
1

我想用自己的常量(而不是EF的字符串常量)替换鉴别器列。我班如下:链接继承的EF鉴别器

[Table("stor_store")] 
public abstract StoreBase { /* Base fields */ } 

public StoreTemplate : StoreBase {/* Extra fields */ } 

public Store : StoreBase {/* Extra fields */ } 

[Table("cust_customer")] 
public Customer : Store { /* Extra fields */ } 

[Table("engi_engineer")] 
public Engineer : Store {/* Extra fields */ } 

我一直在试图映射使用流利的API列:

modelBuilder.Entity<StoreBase>() 
    .Map<StoreTemplate>(m => m.Requires("stor_type").HasValue((byte)0) 
    .Map<Store>(m => m.Requires("stor_type").HasValue((byte)1)) 
    .Map<Customer>(m => m.Requires("stor_type").HasValue((byte)2)) 
    .Map<Engineer>(m => m.Requires("stor_type").HasValue((byte)3)); 

但是EF总是创建鉴别列。这个映射之前已经有效,但是双嵌套继承似乎已经抛出了它。谢谢你的帮助。

回答

1

我可以在这里看到你的问题,我想这是因为Store已经被分配了一个值,所以也许当你试图为继承的实体设置它失败的值?

您可以尝试不同的顺序:重新排序并没有帮助!

modelBuilder.Entity<StoreBase>() 
.Map<StoreTemplate>(m => m.Requires("stor_type").HasValue((byte)0) 
.Map<Customer>(m => m.Requires("stor_type").HasValue((byte)2)) 
.Map<Engineer>(m => m.Requires("stor_type").HasValue((byte)3)) 
.Map<Store>(m => m.Requires("stor_type").HasValue((byte)1)); 

另一种方法

然而,当你的产业变得更加复杂,也许你应该考虑实施类似的“表每类型”(TPT)策略?这种方法会将你的类型分离到它们自己的表格中,保存在较小的鉴别器的空列上,并给你一个更清晰的结构。

enter image description here

你可以找到一个完整描述的细节在这里:http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

+1

我并没有解决我的问题,鉴别仍然存在重新排序后的地图。但我想我会选择TPT。 – Tim