В EF легко загружать связанные объекты.
Но у меня возникают трудности с включением унаследованных объектов при загрузке данных с использованием модели таблиц для каждого типа.
Это моя модель:
Сущности:
-
ArticleBase
(базовая сущность статьи)-
ArticleSpecial
(унаследовано отArticleBase
)
-
-
UserBase
(базовый пользовательский объект)-
UserSpecial
(наследуется отUserBase
)
-
-
Image
Отношения такие, как показано на изображении (без многих столбцов):
На самом деле мои пользователи всегда имеют тип UserSpecial
, поскольку UserBase
используется в другом приложении, поэтому мы можем делиться учетными данными. Это единственная причина, у меня есть две отдельные таблицы. Таблица UserBase
не может быть изменена каким-либо образом, потому что другое приложение UserBase
бы.
Вопрос
Как я полагаю, чтобы загрузить ArticleSpecial
как с CreatedBy
и EditedBy
набора, так что оба типа UserSpecial
(который определяет Image
отношения)?
Я пробовал (но безуспешно) эти варианты:
1. Использование лямбда-выражений:
context.ArticleBases
.OfType<ArticleSpecial>()
.Include("UserCreated.Image")
.Include("UserEdited.Image");
В этом случае проблема заключается в том, что CreatedBy
и EditedBy
связаны с UserBase
, которая не определяет навигацию по Image
. Поэтому я должен как-то привести эти два к типу UserSpecial
например:
context.ArticleBases
.OfType<ArticleSpecial>()
.Include("UserCreated<UserSpecial>.Image")
.Include("UserEdited<UserSpecial>.Image");
Но, конечно, использование обобщений в Include("UserCreated<UserSpecial>.Image")
не работает.
2. Я пытался использовать запрос LINQ
var results = from articleSpecial in ctx.ArticleBase.OfType<ArticleSpecial>()
join created in ctx.UserBase.OfType<UserSpecial>().Include("Image")
on articleSpecial.UserCreated.Id equals created.Id
join edited in ctx.UserBase.OfType<UserSpecial>().Include("Image")
on articleSpecial.UserEdited.Id equals edited.Id
select articleSpecial;
В этом случае я получаю только экземпляры объекта ArticleSpecial
без установки связанных свойств. Я знаю, что должен как-то их выбрать, но не знаю как?
Выберите часть в моем LINQ может быть изменен на что-то вроде
select new { articleSpecial, articleSpecial.UserCreated, articleSpecial.UserEdited };
но изображения все еще не загружены в мой контекст. Мои объединения в этом случае едва используются для фильтрации результатов articleSpecial, но они не загружают объекты в контекст (я полагаю).