控制实体框架中属性的TPT映射

时间:2015-01-28 13:33:47

标签: c# sql .net entity-framework entity-framework-6

我试图控制Entity Framework 6如何将我的类层次结构映射到表中,以便层次结构中间的抽象类中的属性映射到后代类型,而不是映射到其基类。

我的类层次结构非常简单:

public abstract class BaseType
{
    public int Id { get; set; }
    public DateTime DateField { get; set; }
}

public abstract class DerivedAbstract : BaseType
{
    public string MapToChild { get; set; }
}

public class Concrete1 : DerivedAbstract
{
    public int Age { get; set; }
}

public class Concrete2 : DerivedAbstract
{
    public string Name { get; set; }
}

我已经设置了一个简单的每个表类型的层次结构:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<BaseType>();
    modelBuilder.Entity<Concrete1>().ToTable("Concrete1");
    modelBuilder.Entity<Concrete2>().ToTable("Concrete2");
}

这给了我三个表:BaseTypesConcrete1Concrete2。到目前为止,我感到非常高兴,但我的挑战是,MapToChild类中定义的字段DerivedAbstract被映射到BaseTypes表而不是Concrete1两个和Concrete2表。

这在大多数情况下都有意义,但在我正在进行的项目中却没有。所以我正在寻找一种方法来告诉Entity Framework我希望将属性映射到两个表Concrete1Concrete2

到目前为止,我一直无法找到办法。 Entity Framework是否支持它?

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您告诉它映射BaseType。因此,它创建基本类型作为TPH映射并添加鉴别器。

如果删除BaseType映射,您将获得concrete1的表和concrete2的表格,我认为这是您想要的。正确?

啊,对不起,可能是你想要的。我无法映射您的类,因此BaseType是一个表,并且MapToChild在每个具体类型中。我假设您正在这样做,因此您可以查询BaseType并获取多个子类型。

所以,别介意。