我收到以下错误:
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成为一个单身人士,我会避免这种情况,除非你有一个很好的理由让它成为一个单身人士.
总结以上是内存溢出为你收集整理的c# – 在ASP .Net Singleton注入类中使用DbContext全部内容,希望文章能够帮你解决c# – 在ASP .Net Singleton注入类中使用DbContext所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)