EF: Могу ли я смешать TPH и TPT, когда абстрактная база и несколько конкретных типов находятся в таблице TPH, а другие типы имеют свою собственную таблицу? - PullRequest
2 голосов
/ 17 мая 2011

Прежде всего, эти вопросы похожи, но определенно не совпадают:

Могу ли я смешать таблицу по иерархии и таблицу по типу в Entity Framework? - относится к другому сценарию.

Entity Framework: смешивать таблицу по типу и таблице по иерархии - еще один сценарий, который, несмотря на принятие ответа на первый сценарий, не связан с ним (*).

(*) Во-вторых, я успешно смешал таблицу на тип и таблицу на иерархию в 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 находится в EntitySet «BaseTables», а Entity имеет тип [MyNamespace.Entity3]) Путь \ К \ My.edmx 981 15 MyAssembly

  • Есть ли способ заставить эту работу?
  • Если есть возможность взломать edmx, чтобы это работало, потеряю ли я взлом при каждом обновлении из базы данных?

1 Ответ

5 голосов
/ 17 мая 2011

Я нашел рабочий процесс, который позволяет выполнять такие сопоставления через конструктор:

  1. Создать BaseEntity, Entity1, Entity2, Entity3
  2. Сопоставить BaseEntity с BaseTable как абстрактный
  3. Сопоставить сущность 1 с базовой таблицей с условием
  4. сопоставить сущность 2 с базовой таблицей с условиями
  5. сопоставить сущность 3 с дочерней таблицей 3
  6. Unmap BaseEntity

Чтобы добавить дополнительные дочерние таблицы позже:

  1. Переопределить BaseEntity
  2. Сопоставить новые дочерние таблицы
  3. Unmap BaseEntity
...