2015-04-18 3 views
4

После MSDN documentation мы можем использовать Local свойство, чтобы получить местные/кэшированные данные непосредственно из контекста без дополнительных запросов к источнику данных:Использование DbSet <TEntity> .local собственности в Entity Framework

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

Проблема заключается в том, что код не работает (Local пуста):

context.SampleEntities.Select(x => new { x.A, x.B }).Load(); 
// context.SampleEntities.Local.Count is 0 

Но в данном случае, кажется, работает правильно:

context.SampleEntities.Load(); 
// context.SampleEntities.Local.Count is not 0 

Может кто-то может объясните, что является правильным способом использования Местный property?
Более того, как использовать его с частично загруженными объектами, как в случае выше?

+2

EF не имеет возможности хранить эти запрошенные запросы: у вас нет коллекции, содержащей только эти поля. Я бы предположил, что просто невозможно кэшировать их локально по этой причине. –

+0

Но я думаю, что это должна быть одна и та же коллекция (SampleEntities), где объекты не полностью загружены (например, некоторые поля пустые). Моя логика заключается в том, что результат SQL-запроса также должен быть сохранен в DbSet (где действительно важно ключ сущности и состояние объекта) или альтернативным способом, частично загруженные объекты вообще не кэшируются. Итак, вы указываете, что второй сценарий правильный? – Kryszal

ответ

5

Ожидаемое поведение. Локальные объекты кэшей, которые были загружены вами из базы данных в течение жизни объекта DbContext. При запросе:

context.SampleEntities.Select(x => new { x.A, x.B }) 

вы загружаются в память приложения не SampleEntity объекта, а только его proeprties А и В. Выберите это, а также переведены на SQL запрос, чтобы ограничить строки, возвращаемые из запроса и, таким образом, повысить производительность.

+0

OK, спасибо. Я нашел подобное объяснение в этом потоке: http://stackoverflow.com/questions/12668469/entity-framework-partial-load Итак, я вижу, что объекты, возвращенные методом Select, не отслеживаются вообще. – Kryszal

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