gpt4 book ai didi

c# - 在 ASP .Net 单例注入(inject)类中使用 DbContext

转载 作者:IT王子 更新时间:2023-10-29 04:24:58 31 4
gpt4 key购买 nike

我需要在 Startup 类中实例化的 Singleton 类中访问我的数据库。似乎直接注入(inject)它会导致释放 DbContext。

我收到以下错误:

Cannot access a disposed object. Object name: 'MyDbContext'.

我的问题是双重的:为什么这行不通,以及如何在单例类实例中访问我的数据库?

这是我的 Startup 类中的 ConfigureServices 方法:

public void ConfigureServices(IServiceCollection services)
{
// code removed for brevity

services.AddEntityFramework().AddSqlServer().AddDbContext<MyDbContext>(
options =>
{
var config = Configuration["Data:DefaultConnection:ConnectionString"];
options.UseSqlServer(config);
});

// code removed for brevity

services.AddSingleton<FunClass>();
}

这是我的 Controller 类:

public class TestController : Controller
{
private FunClass _fun;

public TestController(FunClass fun)
{
_fun = fun;
}

public List<string> Index()
{
return _fun.GetUsers();
}
}

这是我的 FunClass:

public class FunClass
{
private MyDbContext db;

public FunClass(MyDbContext ctx) {
db = ctx;
}

public List<string> GetUsers()
{
var lst = db.Users.Select(c=>c.UserName).ToList();
return lst;
}
}

最佳答案

原始来源:https://entityframeworkcore.com/knowledge-base/51939451/how-to-use-a-database-context-in-a-singleton-service-

由于默认情况下 DbContext 是有范围的,因此您需要创建范围才能访问它。它还允许您正确处理它的生命周期 - 否则您会长时间保留 DbContext 的实例,不建议这样做。

public class Singleton : ISingleton 
{

private readonly IServiceScopeFactory scopeFactory;

public Singleton(IServiceScopeFactory scopeFactory)
{
this.scopeFactory = scopeFactory;
}

public void MyMethod()
{
using(var scope = scopeFactory.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<DbContext>();

// when we exit the using block,
// the IServiceScope will dispose itself
// and dispose all of the services that it resolved.
}
}
}

关于c# - 在 ASP .Net 单例注入(inject)类中使用 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36332239/

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