Проблемы наследования с Entity Framework (таблица для каждого типа)
-
03-07-2019 - |
Вопрос
Для части проекта, над которым я сейчас работаю, у меня есть набор из четырех таблиц для синдицируемых действий.Одна таблица является абстрактной основой для трех других, и каждая таблица представлена в моей модели EF следующим образом:
Модель EF – действия http://chris.charabaruk.com/system/files/images/EF+Model+Actions.png
Однако есть две проблемы, с которыми я сейчас сталкиваюсь.Первая проблема в том, что Actor
(ссылка на User
) и Subject
(ссылка на сущность класса, связанную с каждым типом действия) null
в моих подклассах, несмотря на то, что связанные столбцы базы данных содержат действительные ключи к строкам в связанных с ними таблицах.Хотя я могу получить ключи через ActorReference
и SubjectReference
это, конечно, требует настройки нового контекста EF и запроса к нему объектов, на которые ссылаются (как Foo
Reference.Value
также является нулевым).
Вторая проблема заключается в том, что взаимное завершение отношений между конкретными классами действий и связанными с ними классами сущностей всегда ничего не дает.Например, Task.RelatedActions
, который должен дать мне все TaskAction
объекты, где Subject
относится к конкретному объекту задачи, на котором RelatedActions
называется, напрочь лишен предметов.Опять же, в базе данных существуют действительные строки, Entity Framework просто не помещает их в объекты и не передает мне.
Кто-нибудь знает, что я делаю неправильно и что мне следует сделать, чтобы все заработало?
Обновлять: Кажется, что ни одно из свойств отношений больше не работает в моей модели сущности.Что за черт...
Решение
Я думаю, что проблема, с которой вы столкнулись, заключается в том, что по умолчанию EF не загружает связанные объекты автоматически.Если вы загрузите сущность, коллекция или ссылка на связанные сущности будут пустыми, если вы не выполните одно из следующих действий:
1) Используйте нетерпеливую загрузку, чтобы получить основной объект и связанный объект в одном запросе.Для этого измените свой запрос, добавив вызов метода Include.В приведенном выше примере вы можете использовать следующий запрос:
from a in context.Actions.Include("Actor") select a
Это позволит получить каждое из действий с помощью соответствующего метода Actor.
2) Используйте явную отложенную загрузку для получения связанного объекта, когда он вам понадобится:
action1.ActorReference.Load()
В версии EF, которая будет поставляться с .Net 4.0, у вас также будет следующая дополнительная опция:
3) Включите неявную отложенную загрузку, чтобы связанные объекты автоматически извлекались при ссылке на свойство навигации.
- Дэнни