关于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();
}
}
}
}
这样就完事大吉了,希望对遇到此类问题的朋友有所帮助