为什么在循环中引用DbSet.Local会变慢?

时间:2016-09-09 09:07:58

标签: entity-framework sqlite

我正在使用带有sqlite数据库的Entity-Framework 6.1.3。 在页面加载期间,我正在循环中初始化一些属性(见下文)。

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;
}

具有相同数据量的相同循环需要~40ms

那么为什么访问DBSet.Local这么慢?

编辑:

Db.Configuration.AutoDetectChangesEnable = false

也可以快速完成任务。但是我仍然不明白为什么这是一个问题。我分配给我的属性只是链接到字段 - 所以这里没有任何操作。在分配期间不应对DBSet进行任何更改。

1 个答案:

答案 0 :(得分:3)

只要您访问 Local属性(使用属性getter),DbContext.Configuration.AutoDetectChangesEnabled属性为true(默认情况下),EF就会调用{{1} }减慢过程的方法。