EF:当抽象基础和一些具体类型在TPH表中并且其他类型有自己的表时,我可以混合TPH和TPT吗?

时间:2011-05-17 17:53:10

标签: entity-framework entity-framework-4 table-per-hierarchy table-per-type

首先,这些问题类似,但绝对不一样:

Can I mix Table per Hierarchy and Table per Type in Entity Framework? - 指的是另一种情况。

Entity Framework: mix table per type and table per hierarchy - 另一种情况是,尽管接受对第一种情况的回答与它无关(*)。

(*)其次,当使用table-per-entity和带有表的鉴别符的表映射基本实体时,我在Entity Framework中成功地混合了每个类型的表和每个层次的表 - 每个层次结构都在链条下方。


我正在尝试映射以下内容:

表:

BaseTable
{
    int PK1;
    int PK2;
    string? Value1;
    double? Value2;
}

ChildTable3
{
    int PK1;
    int PK2;
    int Value;
}

实体:

abstract BaseEntity : class // Maps to BaseTable
{
    int PK1; // Maps to PK1 in relevant table
    int PK2; // Maps to PK2 in relevant table
}

Entity1 : BaseEntity // Maps to BaseTable when Value1 != null
{
    string Value; // Maps to Value1
}

Entity2 : BaseEntity // Maps to BaseTable when Value1 == null && Value2 != null
{
    double Value; // Maps to value2
}

Entity3 : BaseEntity // Maps to ChildTable3
{
    int Value; // Maps to value
}

在添加Entity3映射之前。

添加Entity3及其映射后,我在编译时收到以下错误:

错误1错误3026:从第980,986,995行开始映射片段时出现问题:表BaseTable中可能出现数据丢失或键约束违规。 具有密钥(PK)的实体在以下情况下不会往返:   (PK在'BaseTables'实体集中,实体是类型[MyNamespace.Entity3])     Path \ To \ My.edmx 981 15 MyAssembly

  • 有没有办法让这项工作?
  • 如果有可能破解edmx来完成这项工作,我是否会在数据库的每次更新中放弃黑客攻击?

1 个答案:

答案 0 :(得分:5)

我找到了一个工作流程,可以通过设计师执行这样的映射:

  1. 创建BaseEntity,Entity1,Entity2,Entity3
  2. 将BaseEntity映射到BaseTable作为抽象
  3. 使用条件
  4. 将Entity1映射到BaseTable
  5. 使用条件将实体2映射到BaseTable
  6. 将实体3映射到ChildTable3
  7. 取消映射 BaseEntity
  8. 稍后添加其他子表:

    1. 重新映射BaseEntity
    2. 映射新子表
    3. Unmap BaseEntity