Привет, проблема с EF-объектами, точнее с навигационными свойствами (Db-Context) через сервис WCF.
Сущности сгенерированы по базе данных автоматически. DBContext сконфигурирован так:
"Корневые" объекты получаю через метод 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-сущностей передается в метод как параметр, т.е. динамический.