У меня есть модель EF4, построенная с абстрактными сущностями / классами:
Обратите внимание, как State сущность имеет навигационное свойство, называемое Страна .
Примечание. У меня отключена отложенная загрузка, поэтому я должен загружать ее по требованию.
Теперь, если у меня есть следующий метод:
public Location FindSingle(int id)
{
return _repository.Find().WithId(id).SingleOrDefault();
}
Это не возвращает никаких ассоциаций по умолчанию.Но как я могу динамически активно загружать ассоциации, когда я явно этого хочу?
Я не могу этого сделать:
return _repository.Find().WithId(id).Include("Country").SingleOrDefault();
Поскольку я работаю с абстрактным классомназывается Местоположение , которое не имеет навигационного свойства "Страна".Я не знаю , что такое производный тип, пока я на самом деле не выполню запрос с .SingleOrDefault
.
Итак, вот что я должен был сделать:
public Location FindSingle(int id, bool includeAssociations = false)
{
var location = _repository.Find().WithId(id).SingleOrDefault();
return includeAssociations
? LoadAssociation(location)
: location;
}
private Location LoadAssociation(Location location)
{
// test derived-type, e.g:
var state = location as State;
if (state != null)
return _repository.Find().OfType<State>().Include("Country").WithId(id).SingleOrDefault();
}
По сути, я делаю 2 одинаковых звонка.Это работает?Да.Это красиво?Нет, и это на самом деле не «жадная загрузка».
Я знаю, что это не правильное решение, вы, ребята, можете придумать правильное решение?(и да, я знаю, что могу использовать хранимые процедуры, но я действительно хочу просмотреть мой репозиторий / модель здесь, чтобы сущности были правильно прикреплены к графику и готовы для редактирования).
Даже если .Include
вызывает левое внешнее соединение, проблема в том, что я отрабатываю набор сущностей "Locations".Мне нужно .Include
для "State", но "States" принадлежат к набору сущностей "Locations" (производные классы принадлежат набору сущностей их родителей).
Так что я думаю, мой вопрос на самом деле довольно общий- как нам сделать .Включить потомка абстрактной сущности, если мы не знаем заранее, что это за ребенок?
Помните, я не могу сначала использовать .OfType<T>()
(и затем .Include для производного типа), так как я не знаю, что такое T (и при этом не вызывает вызывающий код), следовательно, дженерики здесь не могут быть использованы.