gpt4 book ai didi

c# - 为什么 DBContext 放入 IMemoryCache 后被释放(.NET Core/EF Core)

转载 作者:行者123 更新时间:2023-11-30 13:35:30 25 4
gpt4 key购买 nike

我试图将 db-data 的一个子集放入 IMemoryCache 中,但是我第二次调用该应用程序时,出现错误:

ObjectDisposedException: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances. Object name: 'WebDbContext'.

我的代码片段:

    public class ArticleRepository : IArticleRepository
{
private readonly WebDbContext _WebDbContext;
private readonly IMemoryCache _cache;

public ArticleRepository(WebDbContext WebDbContext, IMemoryCache cache)
{
_WebDbContext = WebDbContext;
_cache = cache;
}

public IQueryable<Articles> WebshopArticles
{
get
{
return _cache.GetOrCreate("WebshopArticles", entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1);
return _WebDbContext.Article.Include(s => s.Details);
});
}
}

public IQueryable<Articles> GetArticles(string category)
{
return WebshopArticles.FirstOrDefault(s => s.Category == Category);
}
}

看起来 DBContext 在我第一次将它放入缓存后就被释放了。我该如何处理?

最佳答案

您正在使用依赖注入(inject)通过构造函数获取 WebDbContext 的实例。 ASP.NET Core 通过为您启动一个 WebDbContext 对象并在它创建您的存储库类的实例时将其注入(inject)构造函数调用来实现这一点。

但是 WebDbContext 对象仅在当前 HTTP 请求的生命周期内可用。一旦该 HTTP 请求完成,ASP.NET Core 就会摆脱它。这就是您看到它被处置的原因。

更新:我明白你在做什么。问题出在这里:

return _WebDbContext.Article.Include(s => s.Details);

那不缓存数据。缓存查询 (IQueryable)。在您枚举它(循环遍历它)之前,查询不会被执行。这被称为“延迟加载”。因此,您的 GetArticles 实际上会在每次调用时再次执行查询。

您第一次使用它时(在您缓存它的同一个 HTTP 请求中),它可以正常工作。但是当你第二次使用它时,上下文被释放,查询无法执行。

您需要强制它立即执行查询。一种简单的方法是调用 ToList():

return _WebDbContext.Article.Include(s => s.Details).ToList();

您还需要将属性类型更改为 IEnumerable

关于c# - 为什么 DBContext 放入 IMemoryCache 后被释放(.NET Core/EF Core),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047209/

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