如何将子类属性映射到每个层级表中的列

本文关键字:子类 属性 映射 | 更新日期: 2023-09-27 18:06:51

注意:我认为这在技术上仍然是代码优先的,但我也有一个现有的数据库,所以我没有在飞行中生成模型或数据库(no .edmx)。

我有一个TPH情况,其中子类具有特定于它们的字段。我为基类定义了一个EntityTypeConfiguration如何将子类特定的字段映射到数据库表中的列?

public class Letter
{
    public string Name { get; set; }
}
public class A : Letter
{
    public int quantity { get; set; }
}
public class B : Letter
{
    public ComplexType description { get; set; }
}

public class LetterMap : EntityTypeConfiguration<Letter>
{
    HasKey...
}

这是EF 4.1。

编辑:

我已经实现了Eranga下面建议的解决方案。我现在的问题是两个子类将不同的值映射到同一列。(第三个子类根本不填充列,这就是为什么我可以将属性向上移动一个级别)。

(59,6):错误0019:类型中的每个属性名称必须是唯一的。属性名称'Description_Title'已定义。

例如:

B.description.title映射到列"Description_Title"

,

C.description.shortTitle映射到同一列

如何将子类属性映射到每个层级表中的列

使Letter类抽象

public abstract class Letter
{
    public string Name { get; set; }
}
public class LetterMap : EntityTypeConfiguration<Letter>
{
    public LetterMap()
    {
        HasKey(l => l.Id);
        //assuming discriminator column is "Type"
        Map<A>(a => a.Requires("Type").HasValue<byte>(1));
        Map<B>(b => b.Requires("Type").HasValue<byte>(2));
    }
}
public class BMap : EntityTypeConfiguration<B>
{
    public LetterMap()
    {
          HasOptional(b => b.description)
            WithMany()
            HasForeignKey(b=> b.descriptionId);
    }
}