2016-09-09 2 views
1

Я использую Entity-Framework 6.1.3 с базой данных sqlite. Во время загрузки страницы я инициализирую некоторые свойства в цикле (см. Ниже).Почему ссылка на DbSet.Local медленная в цикле?

foreach (var trade in model.Trades) 
{ 
    trade.ExchangeRates = Db.ExchangeRates.Local; 
    trade.BaseCurrency = Prj_TradAc.Properties.Settings.Default.BaseCurrency; 
} 

Db.ExchangeRates.Local никогда не попадает в базу данных, которая ожидается. Таким образом, я ожидал присвоить ссылку на Db.ExchangeRates.Local, которая должна быть быстрой. Однако только с ~ 500 сделками цикл занимает почти 10 секунд!

Когда я делаю следующее

var ers = Db.ExchangeRates.Local; 
foreach (var trade in model.Trades) 
{ 
    trade.ExchangeRates = ers; 
    trade.BaseCurrency = Prj_TradAc.Properties.Settings.Default.BaseCurrency; 
} 

тот же цикл с тем же количеством данных занимает ~ 40мс

Так почему доступ DBSet.Local так медленно?

EDIT:

Db.Configuration.AutoDetectChangesEnable = false 

также делает назначение быстро. Однако я до сих пор не понимаю, почему здесь проблема. Мои свойства, которые я назначаю, связаны только с полями, поэтому здесь не происходит никакой операции. Во время назначения не должно быть изменений в DBSet.

+1

Что произойдет, если вы установите 'Db.Configuration.AutoDetectChangesEnable' на' false'? –

+0

@IvanStoev это хорошо -> 40ms – Vanice

+0

Хорошо, если это уже извлеченный список, то почему вы используете это внутри цикла 'Db.ExchangeRates.Local'? Другими словами, используя 'Db' снова? – Sampath

ответ

1

В любое время вы доступLocal недвижимости (с использованием значения свойства) и DbContext.Configuration.AutoDetectChangesEnabled свойство true (по умолчанию), EF вызывает ObjectContext.DetectChanges метод, который замедляет процесс.

+0

Есть ли у вас источник документации для этого поведения? – Vanice

+2

Отрицательный. [Entity Framework Automatic Detect Changes] (https://msdn.microsoft.com/en-us/data/jj556205.aspx) частично объясняет концепцию, но это свойство не включено в список. Поэтому, когда нет документации, к счастью, есть инструменты для просмотра исходного кода :) –

+0

Спасибо за ссылку - DbSet.Local в списке – Vanice

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