Проблема загрузки абстрактной коллекции EF 4.1 - PullRequest
1 голос
/ 31 мая 2011

У меня проблема с кодом EF 4.1. Я пытаюсь продемонстрировать на упрощенном примере.

Допустим, у нас есть класс Country, который содержит коллекцию States. Государственная коллекция содержит коллекцию школ. Школа - это абстрактный класс. Имеет специализацию начальной школы и средней школы.

HighSchool обладает свойством коллекции DrivingCourses. DrivingCourses и все другие данные успешно сохраняются в БД.

Моя проблема в том, что когда я загружаю класс Country, коллекция DrivingCourses остается нулевой. (все остальное в порядке)

Как я понимаю, проблема в том, что когда ef загружает и заполняет класс HighSchool, он не знает о коллекции курсов.

Я не могу добавить это отображение, потому что с помощью статического отражения беглого API я могу отображать только свойства (абстрактного) школьного класса.

Я использую конфигурацию по умолчанию для абстракции: таблица на иерархию Может ли кто-нибудь украсить меня, если возможно решить мою проблему с EF 4.1?

Заранее спасибо, Шандор

1 Ответ

1 голос
/ 31 мая 2011

Если я правильно понимаю ваше описание, то ваша модель выглядит примерно так (я опускаю ключевые свойства и т. Д.):

public class Country
{
    public ICollection<State> States { get; set; }
}

public class State
{
    public ICollection<School> Schools { get; set; }
}

public abstract class School { ...  }

public class ElementarySchool : School { ... }

public class HighSchool : School
{
    public ICollection<DrivingCourse> DrivingCourses { get; set; }
}

public class DrivingCourse { ... }

И у вас есть DbContext, который включает public DbSet<Country> Countries { get; set; }.

Теперь вы хотите загрузить все Countries (или отфильтрованную коллекцию стран), включая все свойства навигации (особенно также DrivingCourses).

Я не знаю, возможно ли это с однимтуда и обратно в базу данных (за счет загрузки всех коллекций).Решение, которое потребует многократных поездок туда и обратно, может быть таким:

// Load all Countries including `States` and `Schools` collection
// but not the `DrivingCourses` collection
var countryList = context.Countries
    .Include(c => c.States.Select(s => s.Schools))
    .ToList();

// Create in-memory list of all loaded Schools of type HighSchool
IEnumerable<HighSchool> highSchoolList =
    countryList.SelectMany(c =>
                  c.States.SelectMany(s => s.Schools.OfType<HighSchool>()));

// Explicitely load the DrivingCourses one by one
foreach (var item in highSchoolList)
    context.Entry(item).Collection(h => h.DrivingCourses).Load();

Просто в качестве первой идеи.Вероятно, есть лучшие решения.

Редактировать

Использование Load в странах DbSet не меняет проблему.Load - это то же самое, что и ToList() без фактического возврата результата, объекты просто загружаются в контекст.Приведенный выше код можно переписать так:

context.Countries.Include(c => c.States.Select(s => s.Schools)).Load();

IEnumerable<HighSchool> highSchoolList =
    context.Countries.Local.SelectMany(c =>
                  c.States.SelectMany(s => s.Schools.OfType<HighSchool>()));

foreach (var item in highSchoolList)
    context.Entry(item).Collection(h => h.DrivingCourses).Load();

Но это в основном то же самое, что и раньше, и это также не решает проблему загрузки DrivingCourses в первом операторе Load водиночный DB туда и обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...