Entity Framework проблема ассоциации наследования - PullRequest
0 голосов
/ 05 октября 2010

Я пытаюсь разрешить ситуацию, с которой я столкнулся при внедрении EF в моем проекте.

Я отказался от подхода «таблица за типом», в моем случае ActionUpdate наследуется от ActionHistory, и это прекрасно работает.

То, чего я пытаюсь добиться, - это извлечь ActionUpdate из ActionHistory и иметь свойство навигации в ActionUpdate, которое будет содержать коллекцию сущностей ActionUpdateDetail.

Проблема начинается с наследования: когда я удаляю ActionHistoryId из ActionUpdate согласно образцу MSDN, а затем наследую от ActionHistory и выполняю повторное сопоставление, ActionUpdateId автоматически превращается в свойство не-PK.

Это поведение не позволяет мне сопоставить сущность ActionUpdateDetail, так как мой новый производный класс больше не содержит PK :( Я должен сопоставить ActionUpdate.ActionUpdateId с ActionUpdateDetail.ActionUpdateid

Мои предположения:

  1. Либо вообще невозможно достичь чего-то подобного,
  2. Я просто тупой пердун, пытающийся делать вещи неправильно,
  3. Я обречен:)

причина проблемы

Я думаю, что важно поделиться с вами причиной моей агонии:)

Я интуитивно предполагал, что ActionUpdateDetail должен сопоставляться с идентификатором ActionUpdate, который был неверным.

Вместо этого он должен сопоставляться со свойством ActionHistoryId сущности ActionUpdate, поскольку ActionUpdate является производным от ActionHistory.

Это небольшое изменение привело к тому, что таблица ActionUpdate потеряла свой столбец Id, т.е. она содержит только столбец ActionHistoryId. Причина существования этой таблицы с одним столбцом заключается в том, что ActionHistory является абстрактной сущностью, и мне нужно что-то, например, ActionUpdate для хранения набора сущностей ActionUpdateDetail.

1 Ответ

0 голосов
/ 05 октября 2010

Возможно использовать табличное наследование с EF, и на примере, который вы предоставите, я напишу немного прохождения.Вам просто нужно выполнить следующие шаги:

  1. Перейти к модели данных объекта (двойной щелчок по * .edmx)
  2. Удалить связь между ActionUpdate и ActionHistory
  3. Щелкните правой кнопкой мыши ActionHistory, выберите Добавить> Наследование, выберите ActionHistory в качестве базового класса и ActionUpdate в качестве производного класса
  4. Удалите первичный ключ ActionUpdate (ActionUpdateID).Неважно, что это больше не PK, потому что вы собираетесь использовать базовый класс PK.С точки зрения модели, ваши ActionUpdates будут подмножеством ActionUpdateID
  5. Откройте окно сведений о карте, выберите ActionHistory и сопоставьте идентификатор из базы данных с полем ActionHistoryID.Отныне этот объект будет использовать свой первичный ключ базового класса.
  6. Скомпилируйте или проверьте модель, и она должна работать
  7. Если у вас есть какие-либо проблемы с ActionUpdateDetails, связанным с ActionUpdates (вы не должны 't, но вы никогда не знаете, с EF) вы можете проверить ограничения ассоциации (выберите ассоциацию> панель свойств)

Важное примечание : сделать наследование таблицы для типа базовойи производные классы должны устанавливать отношения от 1 до 0..1.Таким образом, ваша модель не будет поддерживать этот тип при наследовании.Почему вы хотите извлечь сущность ActionUpdate из сущности ActionHistory?

...