实体框架继承映射(TPH)

时间:2014-06-26 19:38:13

标签: c# entity-framework

我正致力于将项目从nHibernate转换为Entity Framework,并坚持使用映射继承的映射问题。

我有以下基类(为简洁起见缩短):

public abstract class Status
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public class ProjectStatus : Status
{ 

}

public class TaskStatus : Status 
{

}

有人能指出我如何编写TaskStatusProjectStatusStatus继承的映射的正确方向吗?我想使用table-per-hierarchy(所有使用Discriminator保存在一个表中)

1 个答案:

答案 0 :(得分:3)

每个层次结构表是默认值。除了已有的设置之外,您不需要提供任何其他设置。

这取自weblogs.asp.net的TPH示例:

public abstract class BillingDetail 
{
    public int BillingDetailId { get; set; }
    public string Owner { get; set; }        
    public string Number { get; set; }
}

public class BankAccount : BillingDetail
{
    public string BankName { get; set; }
    public string Swift { get; set; }
}

public class CreditCard : BillingDetail
{
    public int CardType { get; set; }                
    public string ExpiryMonth { get; set; }
    public string ExpiryYear { get; set; }
}

public class InheritanceMappingContext : DbContext
{
    public DbSet<BillingDetail> BillingDetails { get; set; }
}

这将创建一个名为BillingDetails的表,带有一个鉴别器列。

  

判别者专栏

     

正如您在上面的数据库架构中所看到的,Code First必须添加一个特殊的   用于区分持久类的列:鉴别器。   这不是对象模型中持久化类的属性;   它由EF Code First内部使用。默认情况下,列名称为   “Discriminator”,其类型为字符串。值默认为   持久化的类名 - 在这种情况下,“BankAccount”或“CreditCard”。   EF Code First自动设置和检索鉴别器   值。