加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在ASP .Net Singleton注入类中使用DbContext

发布时间:2020-12-16 01:20:29 所属栏目:百科 来源:网络整理
导读:我需要在我的Startup类中实例化的Singleton类中访问我的数据库.似乎直接注入它会导致处理掉的DbContext. 我收到以下错误: Cannot access a disposed object. Object name: ‘MyDbContext’. 我的问题有两个:为什么这不起作用,如何在单例类实例中访问我的数
我需要在我的Startup类中实例化的Singleton类中访问我的数据库.似乎直接注入它会导致处理掉的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>();
}

这是我的控制器类:

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成为一个单身人士,我会避免这种情况,除非你有一个很好的理由让它成为一个单身人士.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读