Как я обнаружил в своем вопросе Eagerly Load Navigation Property that is List<OfSomeBaseClass>
, невозможно загрузить свойства производного класса с использованием метода EF .Include()
(это было suggested as a future EF feature).Загрузить иерархию объектов с базовым классом с использованием кода EF Сначала в сеанс
Я работал вокруг этого итерируя мои коллекции, которые содержат смесь двойников типов, по отдельности вызывая
ctx.Entry(myDerivedType).Reference("PropOfDerivedType").Load();
Это приводит много дополнительных поездок в базу данных, но, по крайней мере, это работает.
Теперь мне нужно загрузить такую иерархию объектов и сохранить ее в сеансе веб-приложения MVC. Поскольку DbContext
не должен быть частью сессии, я верю я должен загрузить граф объекта AsNoTracking()
, как это:
var myGraph = (from my in ctx.MyHierarchyRoot.Include("NonDerivedStuff")
.AsNoTracking()
where CONDITION select my).Single();
Вопрос 1
Нужны и правильно использовать .AsNoTracking()
если граф объектов должен храниться в сеансе?
Я затем перейти к перебирать полученных братьев и сестер в иерархии и пытаться загрузить их, как это:
foreach (SomeBase b in myGraph.SomeCollection)
{
if (b is SomeConcreteDerivedType)
{
ctx.Entry(b).Reference("SomePropertyOfSomeConcreteDerivedType").Load();
}
}
Однако, так как я загрузил myGraph помощью .AsNoTracking()
, я получаю:
Член «Загрузить» не может быть вызван для свойства «SomePropertyOfSomeConcreteDerivedType», поскольку объект типа «SomeConcreteDerivedType» не существует в контексте. Чтобы добавить объект к контексту, вызовите метод «Добавить» или «Присоединить» к DbSet.
Вопрос 2
Предполагая, что ответ на вопрос 1 «да», то как я могу правильно загрузить навигационные свойства производных типов?
Это кажется довольно неуклюжим для решения «упорство невежественного». Знаете ли вы, планирует ли команда EF сделать улучшения в этой области? –
Как загрузить мои производные объекты, если я отключу создание прокси?Я * требую * ленивой загрузки для загрузки коллекции, содержащей множество производных типов, каждый с разными свойствами, которые, в свою очередь, должны быть загружены. Я все еще могу сериализовать граф объектов, но я предпочел бы использовать наименее тяжелый молот, который выполнит свою работу. Кстати, я ценю всю работу, которую вы делаете в SO, чтобы помочь с проблемами EF. –
Оказывается, я не могу глубоко клонировать граф объектов вообще без отключения прокси, потому что типы прокси-сервера не известны, например, например. http://stackoverflow.com/questions/7276507/serializable-classes-and-dynamic-proxies-in-ef-how –