关于Cannot resolve scoped service from root provider解决方案

今天写代码的时候碰到了一个问题,在StartUp里注册了数据库上下文,如下:

public void ConfigureServices(IServiceCollection services)
{
    var connectionStrings = Configuration.GetConnectionString("DefaultConnection");
    services.AddDbContext<BlogDbContext>(options => options.UseSqlServer(connectionStrings));
}

然后我打算做一个数据库数据初始化的操作,类如下:

    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var dbContext = new BlogDbContext(serviceProvider.GetRequiredService<DbContextOptions<BlogDbContext>>()))
            {
                if (dbContext.Database.EnsureCreated() || !dbContext.Set<User>().Any())
                {
                    var user = new User
                    {
                        DisplayName = "BugChang",
                        Password = "123456",
                        UserName = "BugChang"
                    };
                    dbContext.Set<User>().Add(user);
                    dbContext.SaveChanges();
                }
            }
        }
    }

然后在Configure的最后加上 SeedData.Initialize(app.ApplicationServices);,信心满满的跑代码发现运行不起来,抛出了这么个异常Cannot resolve scoped service 'XXXX' from root provider,我记得几个月前我就是这么用的,貌似没啥问题,不知道什么原因。通过不断的尝试发现了问题关键点。
我注册的BlogDbContext用的是Scope,但是我又在Scope外访问BlogDbContext,所以抛出了异常。
那么问题就清晰了,我们可以在这个方法中单独创建一个Scope,代码如下:

    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var serviceScope = serviceProvider.CreateScope()) //手动高亮
            {
                var dbContext = serviceScope.ServiceProvider.GetService<BlogDbContext>(); //手动高亮
                if (dbContext.Database.EnsureCreated() || !dbContext.Set<User>().Any())
                {
                    var user = new User
                    {
                        DisplayName = "BugChang",
                        Password = "000000..",
                        UserName = "BugChang"
                    };
                    dbContext.Set<User>().Add(user);
                    dbContext.SaveChanges();
                }
            }
        }
    }

这样就完事大吉了,希望对遇到此类问题的朋友有所帮助

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容