Проблемы наследования с Entity Framework (таблица для каждого типа)

StackOverflow https://stackoverflow.com/questions/605473

Вопрос

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

Модель EF – действия 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 просто не помещает их в объекты и не передает мне.

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

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

Это было полезно?

Решение

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

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

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

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

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

action1.ActorReference.Load()

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

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

  • Дэнни
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top