Entity Framework 6如何处理同一对象实例的重复查询?

时间:2016-06-10 11:55:44

标签: 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.UpdatedTime = DateTime.Now;

场景2:每次我想更新发票时都要调用GetInvoice;

GetInvoice().UpdatedBy = "Pete"
GetInvoice().UpdatedTime = DateTime.Now;

在第二个场景中,实体框架是第二次查询数据库还是仅返回发票的缓存实例(首先检查缓存实例,如果找不到则只查询数据库)?

2 个答案:

答案 0 :(得分:1)

  

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

当您调用GetInvoice();

时,将会对数据库进行多次数据调用

EF here

的效果考虑因素

如果您缩进以进行缓存,请阅读有关第二级缓存here

的更多信息

答案 1 :(得分:1)

它将第二次查询数据库并返回一个缓存的实例。当您第二次查询发票时,它将执行新查询但随后丢弃所有结果并返回已存在的实例,因为上下文已包含具有相同主键的相同类型的映射实体。例如,如果您的发票将在第一次和第二次电话之间进行外部修改 - 尽管进行了第二次数据库调用,您仍然无法看到这些更改。