2014-06-26 192 views
1

我正致力于将项目从nHibernate转换为实体框架,并且坚持映射继承的映射问题。实体框架继承映射(TPH)

我有以下的基类(简称为简洁起见):

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

public class ProjectStatus : Status 
{ 

} 

public class TaskStatus : Status 
{ 

} 

有人能指出我在怎么写映射TaskStatusProjectStatusStatus继承正确的方向?我想使用按层次表(全部使用分辨器保存在一个表中)

回答

3

表每层次结构是默认值。除了你已有的东西外,你不需要提供任何额外的设置。

这是从例如TPH取自weblogs.asp.net

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单个表。

鉴别列

正如你可以在上面的DB模式看,代码首先必须添加特殊 列持久化类进行区分:鉴别。 这不是我们对象模型中持久化类的属性;它由EF Code First在内部使用。默认情况下,列名是 “Discriminator”,其类型是字符串。这些值默认为 持久类名 - 在本例中为“BankAccount”或“CreditCard”。 EF Code First自动设置和检索鉴别器值 值。

+0

谢谢!这非常有帮助! –