Entity Framework: загрузка навигационных свойств наследников
От: serber  
Дата: 21.08.15 15:01
Оценка: 5 (1)
Имеется примерно следующая структура классов:

public class Person
{
    public long Id { get; set; }
}

public class MarketUser : Person
{
    public ICollection<Order> Orders { get; set; }
}

public class AdminUser : Person
{
    public ICollection<Request> Requests { get; set; }
}


Generic метод

public ICollection<TPerson> GetPersons<TPerson>() where TPerson : Person
{
    DbSet personDbSet = GetDbSet<Person>();

    ICollection<TPerson> personsCollection = personDbSet.OfType<TPerson>()
                                                        .Include("Orders")
                                                        .Include("Requests")
                                                        .ToList();

    return personsCollection;
}


Пример вызова метода

ICollection<Person> persons = GetPersons<Person>();


Вопрос в том, как загрузить навигационные свойства? Сейчас подобная конструкция приводит к возникновению исключения (что вполне логично), т.к. у MarketUser нет свойства Requests, а у AdminUser нет свойства Orders
Отредактировано 21.08.2015 15:35 serber . Предыдущая версия .
entity framework .net linq
Re: Entity Framework: загрузка навигационных свойств наследн
От: Albeoris  
Дата: 22.08.15 00:18
Оценка: 5 (1)
S>Вопрос в том, как загрузить навигационные свойства? Сейчас подобная конструкция приводит к возникновению исключения (что вполне логично), т.к. у MarketUser нет свойства Requests, а у AdminUser нет свойства Orders
Ты не одинок:
http://entityframework.codeplex.com/workitem/86
https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1249289-eager-loading-for-properties-of-derived-classes

А до поры, ничто не мешает сделать три метода: GetPersons, GetMarketUsers, GetAdminUsers. Чтобы избежать дублирования кода, загрузку основной информации делегировать методу GetPersons, а в двух других — инклюдить специфичные свойства. Заодно избавишься от Generic'а там, где он собственно и не нужен.

P.S. Как человек максимально далёкий от EF, не могу сказать наверняка. Но, вроде бы, Include имеет типо-безопасную реализацию. Если ты можешь проверить тип персоны внутри Include'а, то также можешь воткнуть проверку вида:
Include(e=>(e as IQueryable<MarketUsers>)?.Requests), но я не уверен, что это возможно. Попробуй.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Отредактировано 22.08.2015 0:22 Albeoris . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.