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

前端之家收集整理的这篇文章主要介绍了asp.net – EF是否在DbContext的不同实例之间缓存实体?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Asp.net中为每个查询创建DbContext是否只使EF从其缓存中读取数据,或者每次都查询整个集合的数据?我知道每个AppDomain的元数据缓存,但只是数据呢?

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

解决方法

@H_404_7@ 实体框架每个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,你会得到不同的行为,用于字符串比较有关区分大小写等等.

原文链接:https://www.f2er.com/aspnet/247813.html

猜你在找的asp.Net相关文章