【发布时间】:2015-01-28 13:33:46
【问题描述】:
我正在尝试控制 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");
}
这给了我三个表:BaseTypes、Concrete1 和 Concrete2。到目前为止,我很高兴,但我的挑战是DerivedAbstract 类中定义的字段MapToChild 映射到BaseTypes 表,而不是Concrete1 和Concrete2 表。
这在大多数情况下是有道理的,但在我正在从事的项目中则不然。所以我正在寻找一种方法来告诉 Entity Framework 我希望将属性映射到两个表 Concrete1 和 Concrete2 。
到目前为止,我一直无法找到一种方法来做到这一点。 Entity Framework 甚至支持它吗?
【问题讨论】:
-
如果添加一个类会发生什么:
public class Concrete3 : BaseType { public string prop {get; set;}}和modelBuilder.Entity<Concrete3>().ToTable("Concrete3");。 -
遇到同样的情况。 MapToChild 仍在 BaseTypes 表中
-
你需要做多态查询吗?
-
这个答案暗示这不受支持。 stackoverflow.com/questions/5776635/…
-
不,不支持。事实上,您需要 TPT 和 TPC 的混合,所有公共属性都在基表中,所有类型都有自己的表(它们从基类型“继承”属性)。理想情况下,您需要选择哪些属性继承哪些不继承。没有用于此的 API,尽管从技术上讲,在 DBMS 术语中,这不是问题。但是您确定要为 each 类型创建一个基表吗? TPT 可能会对性能产生重大影响,因为一切都需要连接或双插入。
标签: c# sql .net entity-framework entity-framework-6