【问题标题】:How to disable MemoryCache in Entity Framework Core?如何在 Entity Framework Core 中禁用 MemoryCache?
【发布时间】:2020-05-18 23:01:51
【问题描述】:

我的 Startup 中有此代码。

var connection = Configuration.GetConnectionString("DefaultConnection")?.Replace("[BD_PASS]", Environment.GetEnvironmentVariable("BD_PASS"));
services.AddDbContext<BdContext>(options => options.UseSqlServer(connection));

services.AddMemoryCache(op =>
            {
                op.SizeLimit = int.Parse(Environment.GetEnvironmentVariable("CACHE_SIZE_LIMIT") ?? "10");
            });

问题是我不知道 Entity Framework Core 会拦截我对数据库的查询。所以,我得到了一个

 _context.Product.ToList();

但是当上面的代码运行时我收到了这条消息。

设置大小限制时,缓存条目必须指定大小值

我可以在配置级别做些什么来说“嘿 EFC,不要费心缓存任何东西。”

【问题讨论】:

  • 感谢@NateBarbettini 的评论,但事实并非如此。我在互联网上只能找到不想使用大小限制的人,但有些图书馆正在使用。在这里,我真的很想使用 Size_Limit,因为这是我的代码的要求。
  • 你能发布一个简短但完整的问题重现吗?
  • 我想没有什么要补充的了,除了我使用的是 ASP.NET Core 2.2 并且该请求是针对为每个请求创建的瞬态 DbContext 发出的。
  • 啊,我现在明白你的问题了。您想使用带有某些参数的 MemoryCache,但实际上 EF Core 也在使用 MemoryCache,而且效果不佳。

标签: c# .net entity-framework asp.net-core entity-framework-core


【解决方案1】:

Entity Framework Core 使用所谓的“共享缓存”。它依赖于服务容器中注册的IMemoryCache。解决方案不是阻止 EF Core 使用缓存,而是为了解缓存大小限制的服务使用不同缓存。

换句话说,为您自己的使用创建一个定制的缓存:

public class LimitedMemoryCache 
{
    public MemoryCache Cache { get; private set; }

    public LimitedMemoryCache(int limit)
    {
        Cache = new MemoryCache(new MemoryCacheOptions
        {
            SizeLimit = 10
        });
    }
}

并将其注册为单独的单例:

var cacheLimit = int.Parse(Environment.GetEnvironmentVariable("CACHE_SIZE_LIMIT") ?? "10");
services.AddSingleton(new LimitedMemoryCache(cacheLimit));

类可以通过注入LimitedMemoryCache 而不是IMemoryCache 来选择使用这个缓存。 Entity Framework Core 和其他任何直接依赖于IMemoryCache 的东西现在可以共存而不会出现任何问题。

in-memory cache docs上提到了这个,这是我自己了解到的:

... 在缓存上设置大小限制时,所有条目在添加时都必须指定大小。这可能会导致问题,因为开发人员可能无法完全控制使用共享缓存的内容。例如,Entity Framework Core 使用共享缓存并且没有指定大小。如果应用设置缓存大小限制并使用 EF Core,则应用会引发 InvalidOperationException。使用 SetSize、Size 或 SizeLimit 限制缓存时,创建缓存单例进行缓存。

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 2016-06-30
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2013-09-11
    相关资源
    最近更新 更多