【问题标题】:Controlling TPT-mapping of properties in Entity Framework控制实体框架中属性的 TPT 映射
【发布时间】: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");
}

这给了我三个表:BaseTypesConcrete1Concrete2。到目前为止,我很高兴,但我的挑战是DerivedAbstract 类中定义的字段MapToChild 映射到BaseTypes 表,而不是Concrete1Concrete2 表。

这在大多数情况下是有道理的,但在我正在从事的项目中则不然。所以我正在寻找一种方法来告诉 Entity Framework 我希望将属性映射到两个表 Concrete1Concrete2

到目前为止,我一直无法找到一种方法来做到这一点。 Entity Framework 甚至支持它吗?

【问题讨论】:

  • 如果添加一个类会发生什么:public class Concrete3 : BaseType { public string prop {get; set;}}modelBuilder.Entity&lt;Concrete3&gt;().ToTable("Concrete3");
  • 遇到同样的情况。 MapToChild 仍在 BaseTypes 表中
  • 你需要做多态查询吗?
  • 这个答案暗示这不受支持。 stackoverflow.com/questions/5776635/…
  • 不,不支持。事实上,您需要 TPT 和 TPC 的混合,所有公共属性都在基表中,所有类型都有自己的表(它们从基类型“继承”属性)。理想情况下,您需要选择哪些属性继承哪些不继承。没有用于此的 API,尽管从技术上讲,在 DBMS 术语中,这不是问题。但是您确定要为 each 类型创建一个基表吗? TPT 可能会对性能产生重大影响,因为一切都需要连接或双插入。

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


【解决方案1】:

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

如果您删除 BaseType 映射,您将获得一个用于具体 1 的表和一个用于具体 2 的表,我认为这是您想要的。对吧?

啊...抱歉,可能是您想要的。我无法映射您的类,因此 BaseType 是一个表,并且 MapToChild 位于每个具体类型中。我假设您正在这样做,因此您可以查询 BaseType 并取回多个子类型。

所以,没关系。

【讨论】:

  • 不,我实际上希望将基类放在单独的表中。我不想要的是将所有其他抽象类也映射到该表。我希望他们的数据在具体类的表中。
  • 是的,我现在看到了,并更正为没关系。你需要一个比我更了解它的人来做这个映射,这是可能的。当然,放弃中级课程是可行的,这不是最好的答案。
猜你喜欢
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
相关资源
最近更新 更多