[英]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.