我正致力于将项目从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
{
}
有人能指出我如何编写TaskStatus
和ProjectStatus
从Status
继承的映射的正确方向吗?我想使用table-per-hierarchy(所有使用Discriminator保存在一个表中)
答案 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自动设置和检索鉴别器 值。