加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – EF是否在DbContext的不同实例之间缓存实体?

发布时间:2020-12-16 04:17:32 所属栏目:asp.Net 来源:网络整理
导读:在 Asp.net中为每个查询创建DbContext是否只使EF从其缓存中读取数据,或者每次都查询整个集合的数据?我知道每个AppDomain的元数据缓存,但只是数据呢? 上下文:使用MVC4 Web API前端的数据采集和可视化应用程序不会称之为“高容量”,但许多查询在较短的时间
在 Asp.net中为每个查询创建DbContext是否只使EF从其缓存中读取数据,或者每次都查询整个集合的数据?我知道每个AppDomain的元数据缓存,但只是数据呢?

上下文:使用MVC4 Web API前端的数据采集和可视化应用程序不会称之为“高容量”,但许多查询在较短的时间范围内返回相同的数据集.

解决方法

实体框架每个AppDomain没有数据缓存,每个上下文实例只有一个缓存.

如果为每个请求或查询创建新上下文,则从空缓存开始,EF将从数据库中获取数据.

此外,术语“每个上下文实例的缓存”可能会产生误导,因为它并不意味着如果实体已经加载到上下文缓存中,EF将不会对数据库运行查询.此缓存的工作方式以及如何利用它(或不利用)如下:

> DbSet上的每个LINQ到实体查询< T>或通常在IQueryable< T>上将运行数据库查询,无论实体是否已存在于上下文中.但是,如果在上下文中已存在与查询实体具有相同密钥的实体,则EF将抛出该查询的结果并将缓存的实体实例返回给调用者.

它会在运行查询后检查具有相同密钥的实体是否存在. (对于复杂查询 – 例如包含Include的查询 – 它之前无法执行此检查,因为它无法知道将返回哪些实体和键值.)

这是默认行为(MergeOption是AppendOnly).我相信您可以将此行为更改为OverwriteChanges和其他选项,但它们都不会避免LINQ查询始终发出数据库查询.
>仅仅通过其键查询实体,您可以使用GetObjectByKey或Find(使用DbContext),它将首先检查具有该键的实体是否已在上下文中缓存,然后返回此缓存对象.如果不是,它将运行数据库查询来加载它.
>您可以查询EF的ChangeTracker,它特别受DbContext支持,您可以通过DbSet< T> .Local集合访问上下文缓存.

这里的问题是,如果Local上的查询没有返回结果,则没有逻辑可以自动查询数据库.您必须手动编写此逻辑.更大的问题是Local上的查询是LINQ-to-Objects而不是LINQ-to-Entities(Local不实现IQueryable< T>,只有IEnumerable< T>),所以你经常需要重写你的查询到act on Local – 例如你不能使用Include here,你不能使用任何EntityFunctions,你会得到不同的行为,用于字符串比较有关区分大小写等等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读