我的Startup.cs中有这段代码:
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
在同一个文件中,我还在新版ASP Core 2中按照MS的建议将service.UseIdentity()
替换为app.UseAuthentication();
。
我的Db背景:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
}
//public DbSet<ApplicationUser> ApplicationUser { get; set; }
//public DbSet<ApplicationRole> ApplicationRole { get; set; }
}
我的自定义角色类:
public class ApplicationRole : IdentityRole
{
public ApplicationRole() : base() { }
public ApplicationRole(string roleName) : base(roleName) { }
public bool IsDefault { get; set; }
}
运行应用程序时,我得到了一个运行的SeedDatabase帮助方法:
var roleManager = serviceProvider.GetService<RoleManager<ApplicationRole>>();
这一切都运行正常,但自从将VS 2017更新到最新版本并安装.NET Core 2.0后,最后一行代码现在抛出以下异常:
System.AggregateException occurred
HResult=0x80131500
Message=One or more errors occurred. (Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.RoleManager`1[CspLicensingPortal.Models.ApplicationRole]' from root provider.)
Source=<Cannot evaluate the exception source>
StackTrace:
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at CspLicensingPortal.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) in D:\gsandorx\Documents\Visual Studio 2017\Projects\CspLicensingPortal\CspLicensingPortal\Startup.cs:line 275
Inner Exception 1:
InvalidOperationException: Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.RoleManager`1[MyApplication.Models.ApplicationRole]' from root provider.
我不确定为什么DI服务管理器不再能够找到我的ApplicationRole类。我已经检查过,我的所有引用都使用了这个类而不是默认的IdentityRole。
有什么想法吗?
答案 0 :(得分:22)
您必须自己创建IServiceScope。
要执行此操作,您必须替换
var roleManager = serviceProvider.GetService<RoleManager<ApplicationRole>>();
与
using (IServiceScope scope = app.ApplicationServices.CreateScope()) {
RoleManager<IdentityRole> roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
// Seed database code goes here
}