asp.net – EF是否在DbContext的不同实例之间缓存实体?
在
Asp.net中为每个查询创建DbContext是否只使EF从其缓存中读取数据,或者每次都查询整个集合的数据?我知道每个AppDomain的元数据缓存,但只是数据呢?
上下文:使用MVC4 Web API前端的数据采集和可视化应用程序不会称之为“高容量”,但许多查询在较短的时间范围内返回相同的数据集. 解决方法
实体框架每个AppDomain没有数据缓存,每个上下文实例只有一个缓存.
如果为每个请求或查询创建新上下文,则从空缓存开始,EF将从数据库中获取数据. 此外,术语“每个上下文实例的缓存”可能会产生误导,因为它并不意味着如果实体已经加载到上下文缓存中,EF将不会对数据库运行查询.此缓存的工作方式以及如何利用它(或不利用)如下: > DbSet上的每个LINQ到实体查询< T>或通常在IQueryable< T>上将运行数据库查询,无论实体是否已存在于上下文中.但是,如果在上下文中已存在与查询实体具有相同密钥的实体,则EF将抛出该查询的结果并将缓存的实体实例返回给调用者. 它会在运行查询后检查具有相同密钥的实体是否存在. (对于复杂查询 – 例如包含Include的查询 – 它之前无法执行此检查,因为它无法知道将返回哪些实体和键值.) 这是默认行为(MergeOption是AppendOnly).我相信您可以将此行为更改为OverwriteChanges和其他选项,但它们都不会避免LINQ查询始终发出数据库查询. 这里的问题是,如果Local上的查询没有返回结果,则没有逻辑可以自动查询数据库.您必须手动编写此逻辑.更大的问题是Local上的查询是LINQ-to-Objects而不是LINQ-to-Entities(Local不实现IQueryable< T>,只有IEnumerable< T>),所以你经常需要重写你的查询到act on Local – 例如你不能使用Include here,你不能使用任何EntityFunctions,你会得到不同的行为,用于字符串比较有关区分大小写等等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 一步步开发自己的博客 .NET版(1、基本显示)
- 身份验证 – 我们可以在Asp.NET Core中销毁/无效
- 你如何获得asp.net控件的自动生成的name属性?
- asp.net mvc中配置全局异常过滤器
- asp.net-mvc – AngularJS $http.put不能与ASP.N
- asp.net-mvc – asp.net MVC 3中视图模型的范围
- asp.net – 是否可以根据用户角色隐藏/显示Kendo
- 在ASP.NET中创建一个适用于黑莓,Windows Mobile和
- asp.net-mvc – 使用Entity Framework 6和ViewMo
- 将linkbutton设置为asp.net中asp:panel的默认按