gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:08:15 25 4
gpt4 key购买 nike

在 Asp.net 中为每个查询创建 DbContext 是否会使 EF 只从其缓存中读取数据,还是每次都查询整个集合的 DB?我知道每个 AppDomain 的元数据缓存,但是仅数据呢?

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

最佳答案

Entity Framework 没有每个 AppDomain 的数据缓存,每个上下文实例只有一个缓存。

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

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

  • LINQ-to-Entities 查询 DbSet<T>或通常在 IQueryable<T>将运行数据库查询,无论实体是否已存在于上下文中。但是,如果上下文中已经存在与被查询实体具有相同键的实体,EF 将丢弃该查询的结果并将缓存的实体实例返回给调用者。

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

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

    这里的问题是,如果在 Local 上进行查询,则没有自动查询数据库的逻辑。不返回结果。您必须手动编写此逻辑。更大的问题是对 Local 的查询是 LINQ-to-Objects 而不是 LINQ-to-Entities( Local 没有实现 IQueryable<T> ,只有 IEnumerable<T> ),所以你经常需要重写你的查询来处理 Local - 例如你不能使用 Include在这里,您不能使用任何 EntityFunctions ,您将获得有关区分大小写等的字符串比较的不同行为。
  • 关于asp.net - EF 是否在 DbContext 的不同实例之间缓存实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17042697/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com