.NET

关于Cannot resolve scoped service

2018-04-21  本文已影响83人  BugChang

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

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

上一篇下一篇

猜你喜欢

热点阅读