2016-08-13 2 views
0

, предполагающая У меня есть три EF классов сущностей:Linq запись (entity.Related) .Query.Load() не писать обратно в коллекции собственность

 
public class Person { 
    ... 
    public ICollection Vehicles { get; set; } 
} 

public class Vehicle { 
    ... 
    public Person Owner { get; set; } 

    public CarModel ModelInfo { get; set; } 
} 

public class CarModel { 
    ... 
    // properties for make, model, color, etc 
} 

Свойство Person.Vehicles лениво загруженные.

Предположим, у меня есть уже загруженный экземпляр Person, и я хочу загрузить его имущество для сбора Vehicle, так что он также включает в себя соответствующее имущество ModelInfo.

Так что у меня это:

void LoadVehiclesAndRelated(MyDbContext dbContext, Person person) 
{ 
    dbContext.Entry(person) 
     .Collection(p => p.Vehicles) 
     .Query() 
     .Include(v => v.ModelInfo) 
     .Load(); 
} 

Используется как так:

using(MyDbContext dbContext = ...) { 

    Person p = GetPerson(123); 

    LoadVehiclesAndRelated(dbContext, p); 
} 

foreach(Vehicle v in p.Vehicles) { 
    Console.WriteLine(v.ModelInfo); 
} 

Однако, когда я делаю это, я получаю исключение во время выполнения, когда он сначала вычисляет выражение p.Vehicles, потому что свойство на самом деле пуст (поэтому он хочет загрузить его), но теперь DbContext удаляется.

Когда .Load() был сделан звонок (внутри LoadVehiclesAndRelated() я видел SQL выполняется на сервере (в SQL Server Profiler), но свойство коллекции остается пустым.

Как я могу затем загрузить свойство и с Include г подсвойства

Досадно, этот сценарий не упоминается в руководстве MSDN для явной загрузки: https://msdn.microsoft.com/en-us/data/jj574232.aspx

+1

Просто для ясности, 'переменная dbContext' внутри' LoadVehiclesAndRelated' так же, как объемлющий 'используя (MyDbContext контекста = ...' –

+0

@IvanStoev Да? - Я добавлю разъяснение на мой вопрос – Dai

ответ

1

выглядит как вызов .Query().Load() не то же самое, как вызов DbCollectionEntry.Load плачевных а главное отличие заключается в том, что первый не устанавливает свойство IsLoaded, что впоследствии вызывает запуск ленивой нагрузки позже. Скорее всего, поскольку, как поясняется в ссылке, первая предназначена для использования для фильтрованных (частичных) сценариев загрузки.

Вскоре, чтобы решить проблему, просто установите IsLoaded к истинным после загрузки коллекции:

var entry = dbContext.Entry(person); 
var vehicleCollection = entry.Collection(p => p.Vehicles); 
vehicleCollection.Query() 
    .Include(v => v.ModelInfo) 
    .Load(); 
vehicleCollection.IsLoaded = true; 

P.S. Ради справедливости, такое поведение является своего рода упоминается в конце Применение фильтров при явной загрузки связанных сущностей раздел:

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

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