2012-05-23 2 views
1

Как я обнаружил в своем вопросе 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 «да», то как я могу правильно загрузить навигационные свойства производных типов?

ответ

2

Нужно ли и правильно использовать .AsNoTracking(), если граф объектов должен храниться в сеансе?

Необходимо убедиться, что сущность, хранящаяся в сеансе, не содержит ссылки на контекст (и не нуждается в контексте). Это должно быть выполнено путем отсоединения объекта до его сохранения на сеанс, но отключение всегда нарушает отношения. Простейшим обходным решением в этом случае может быть отключение создания прокси (ленивая загрузка и динамическое отслеживание изменений не будут работать).

Альтернативный подход заключается в загрузке графа объектов обычным способом и создании глубокого клонирования (сериализации) графика. Глубокий клон всегда полностью отделен от контекста и может быть безопасно сохранен в сеансе.

+1

Это кажется довольно неуклюжим для решения «упорство невежественного». Знаете ли вы, планирует ли команда EF сделать улучшения в этой области? –

+0

Как загрузить мои производные объекты, если я отключу создание прокси?Я * требую * ленивой загрузки для загрузки коллекции, содержащей множество производных типов, каждый с разными свойствами, которые, в свою очередь, должны быть загружены. Я все еще могу сериализовать граф объектов, но я предпочел бы использовать наименее тяжелый молот, который выполнит свою работу. Кстати, я ценю всю работу, которую вы делаете в SO, чтобы помочь с проблемами EF. –

+0

Оказывается, я не могу глубоко клонировать граф объектов вообще без отключения прокси, потому что типы прокси-сервера не известны, например, например. http://stackoverflow.com/questions/7276507/serializable-classes-and-dynamic-proxies-in-ef-how –

Смежные вопросы