Проблемы наследования с Entity Framework (таблица по типу) - PullRequest
0 голосов
/ 03 марта 2009

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

EF Model - Действия http://chris.charabaruk.com/system/files/images/EF+Model+Actions.png

Однако есть две проблемы, с которыми я сейчас сталкиваюсь. Первая проблема состоит в том, что Actor (ссылка на User) и Subject (ссылка на сущность класса, связанного с каждым типом действия) имеют null в моих подклассах, несмотря на связанные столбцы базы данных удерживая действительные ключи к строкам в связанных с ними таблицах. Хотя я могу получить ключи через ActorReference и SubjectReference, это, конечно, требует настройки нового контекста EF и запроса его для объектов, на которые имеются ссылки (поскольку FooReference.Value также является нулевым).

Вторая проблема заключается в том, что взаимное завершение отношений между конкретными классами действий и связанными с ними классами сущностей всегда ничего не приводит. Например, Task.RelatedActions, который должен дать мне все TaskAction объекты, где Subject относится к конкретному объекту задачи, для которого вызывается RelatedActions, полностью лишен объектов. Опять же, в базе данных есть действительные строки, Entity Framework просто не помещает их в объекты и не передает их мне.

Кто-нибудь знает, что я делаю неправильно, и что я должен сделать, чтобы это работало?

Обновление: Похоже, что ни одно из свойств отношений больше не работает в моей модели сущностей. WTF ...

1 Ответ

5 голосов
/ 04 марта 2009

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

1) Используйте готовую загрузку, чтобы получить ваш основной объект и связанный объект в одном запросе. Для этого измените ваш запрос, добавив вызов в метод Include. В приведенном выше примере вы можете использовать следующий запрос:

from a in context.Actions.Include("Actor") select a

Это приведет к извлечению каждого из действий с помощью соответствующего метода Actor.

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

action1.ActorReference.Load()

В версии EF, которая будет поставляться с .Net 4.0, у вас также будет следующая дополнительная опция:

3) Включите неявную ленивую загрузку, чтобы связанные сущности были автоматически получены при обращении к свойству навигации.

  • Danny
...