繁体   English   中英

如何在 Entity Framework Core 中禁用 MemoryCache?

[英]How to disable MemoryCache in Entity Framework Core?

我的启动中有此代码。

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,不要费心缓存任何东西”。

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
        });
    }
}

并将其注册为单独的 singleton:

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

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

在内存缓存文档中提到了这一点,这就是我自己了解它的方式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM