我需要在我的Startup类中实例化的Singleton类中访问我的数据库.似乎直接注入它会导致处理掉的DbContext. 我收到以下错误: Cannot access a disposed object. Object name: ‘MyDbContext’. 我的问题有两个
我收到以下错误:
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>();
}
这是我的控制器类:
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;
}
}
它不起作用的原因是因为.AddDbContext扩展将每个请求添加为作用域.每个请求的范围通常是您想要的,通常每个请求将调用一次保存更改,然后dbcontext将在请求结束时处理.
如果你真的需要在单例中使用dbContext,那么你的FunClass类应该依赖于IServiceProvider和DbContextOptions而不是直接依赖于DbContext,这样你就可以自己创建它.
public class FunClass
{
private GMBaseContext db;
public FunClass(IServiceProvider services, DbContextOptions dbOptions)
{
db = new GMBaseContext(services, dbOptions);
}
public List<string> GetUsers()
{
var lst = db.Users.Select(c=>c.UserName).ToList();
return lst;
}
}
也就是说,我的建议是仔细考虑你是否真的需要你的FunClass成为一个单身人士,我会避免这种情况,除非你有一个很好的理由让它成为一个单身人士.
