如何将子类属性映射到每个层次结构表中的列?

时间:2011-08-29 14:02:23

标签: c# .net entity-framework

注意:我认为这在技术上仍然是代码优先的,但我也有一个现有的数据库,所以我不是动态生成模型或数据库(没有.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建议的解决方案below。我现在的问题是两个子类将不同的值映射到同一列。 (第三个子类根本没有填充列,这就是我可以将属性向上移动一级的原因)。

  

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

例如:

B.description.title映射到“Description_Title”列

,而

C.description.shortTitle映射到同一列

1 个答案:

答案 0 :(得分:2)

使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);
    }
}