C# 实体框架6如何处理同一对象实例的重复查询?

C# 实体框架6如何处理同一对象实例的重复查询?,c#,entity-framework,caching,entity-framework-6,C#,Entity Framework,Caching,Entity Framework 6,我的代码中有以下方法: Invoice GetInvoice() { return entities.Invoices.First(i => i.InvoiceNo == invoiceData.InvoiceId); } 我读过关于一级缓存的文章,但我不确定如果我这样做,EF6内部会发生什么 场景1:获取发票并保存本地参考 var invoice = GetInvoice(); invoice.UpdatedBy = "Pete" invoice

我的代码中有以下方法:

    Invoice GetInvoice()
    {
        return entities.Invoices.First(i => i.InvoiceNo == invoiceData.InvoiceId);
    }
我读过关于一级缓存的文章,但我不确定如果我这样做,EF6内部会发生什么

场景1:获取发票并保存本地参考

var invoice = GetInvoice();
invoice.UpdatedBy = "Pete"
invoice.UpdatedTime = DateTime.Now;
场景2:每次我想更新发票时都调用GetInvoice

GetInvoice().UpdatedBy = "Pete"
GetInvoice().UpdatedTime = DateTime.Now;
在第二个场景中,实体框架是第二次查询数据库,还是只返回发票的缓存实例(首先检查缓存实例,如果没有,则只查询数据库)

使用
.Single
.First
。Where
等不会缓存结果,除非您使用的是二级缓存

调用
GetInvoice()时,将有多个对数据库的数据调用

EF的性能考虑


若您缩进让缓存读取更多关于二级缓存的信息,它将再次查询数据库并返回一个缓存实例。当您第二次查询发票时,它将执行新的查询,但随后放弃所有结果并返回您已经存在的实例,因为上下文已经包含具有相同主键的相同类型的映射实体。例如,如果您的发票在第一次和第二次调用之间被外部修改,您将看不到这些更改,尽管第二次调用了数据库。

使用探查器会让您对此有更多的了解