Проблема с навигационными свойствами (EF.DbContext) через WCF
От: SeLo  
Дата: 09.10.15 11:26
Оценка:
Привет, проблема с EF-объектами, точнее с навигационными свойствами (Db-Context) через сервис WCF.
Сущности сгенерированы по базе данных автоматически. DBContext сконфигурирован так:

result.Configuration.LazyLoadingEnabled = false;
result.Configuration.ProxyCreationEnabled = false;

"Корневые" объекты получаю через метод AsNoTracking(), иначе ошибка, что соединение было преждеврено закрыто.
db.TableName.AsNoTracking().Where(...).ToList();
С этим все нормально, так нужно делать что бы объекты отсоединить от контекста.

Теперь хочу загрузить навигационные свойства. Пробовал:

db.TableName.AsNoTracking().Where(...).Include("..").ToList();
или
db.TableName.AsNoTracking().Where(...).Include("..").AsNoTracking().ToList();

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

Проверял через ObjectContext.ObjectStateManager.GetObjectStateEntries() — ни один из объектов в ObjectStateManager не числится.

Если же делать Include "ручным" способом, т.е. грузить объекты отдельно и присваивать их "корневому", то работает:

var rootList = db.TableName.AsNoTracking().Where(...)ToList();
foreach(var rootObj in rootList ) {
if (rootObj.Table2_ID != null) rootObj.Table2 = db.Table2.AsNoTracking().Where(x => x.ID == rootObj.Table2_ID).First()
}

Но мне такой способ не походит из-за нескольких причин. Одна из них — список Include-сущностей передается в метод как параметр, т.е. динамический.

EF используется 6.1.3, VS 2013, .NET v4.5

Как побороть, что я делаю не так?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.