3

首先,这些问题是相似的,但绝对不一样:

我可以在实体框架中混合使用每个层次结构的表和每个类型的表吗?- 指不同的场景。

实体框架:每种类型的表和每个层次结构的表- 还有一种情况,尽管接受了第一种情况的答案,但与它无关 (*)。

(*) 其次,我在实体框架中成功地混合了每个类型的表和每个层次的表,当使用每个实体的表和具有每个层次的表的鉴别器的表映射基本实体时在链条的下游。


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

表:

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”EntitySet 中且实体类型为 [MyNamespace.Entity3])Path\To\My.edmx 981 15 MyAssembly

  • 有没有办法使这项工作?
  • 如果可以破解 edmx 来完成这项工作,我会不会对数据库的每次更新都进行破解?
4

1 回答 1

5

我找到了一个可以通过设计器执行此类映射的工作流程:

  1. 创建 BaseEntity、Entity1、Entity2、Entity3
  2. 将 BaseEntity 映射到 BaseTable 作为抽象
  3. 使用条件将 Entity1 映射到 BaseTable
  4. 使用条件将 Entity2 映射到 BaseTable
  5. 将 Entity3 映射到 ChildTable3
  6. 取消映射BaseEntity

稍后添加其他子表:

  1. 重新映射 BaseEntity
  2. 映射新的子表
  3. 取消映射 BaseEntity
于 2011-05-17T18:20:24.020 回答