美文网首页.NET
关于Cannot resolve scoped service

关于Cannot resolve scoped service

作者: BugChang | 来源:发表于2018-04-21 21:23 被阅读83次

    今天写代码的时候碰到了一个问题,在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();
                    }
                }
            }
        }
    

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

    相关文章

      网友评论

      本文标题:关于Cannot resolve scoped service

      本文链接:https://www.haomeiwen.com/subject/uqpflftx.html