2017-08-21 4 views
12

ich diesen Code hätte in meinem Startup.cs:ASP.NET Core 2 - Identität - DI Fehler mit benutzerdefinierten Rollen

services.AddDbContext<ApplicationDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

     services.AddIdentity<ApplicationUser, ApplicationRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 

In derselben Datei, ich ersetzt auch die service.UseIdentity() mit app.UseAuthentication(); wie von MS empfohlen in die neue Version von ASP-Core 2.

Mein Db Kontext:

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; } 
} 

Und meine benutzerdefinierte Rollenklasse:

public class ApplicationRole : IdentityRole 
{ 
    public ApplicationRole() : base() { } 

    public ApplicationRole(string roleName) : base(roleName) { } 

    public bool IsDefault { get; set; } 
} 

Wenn die Anwendung ausgeführt wird, habe ich eine SeedDatabase Hilfsmethode bekam, der ausgeführt wird:

var roleManager = serviceProvider.GetService<RoleManager<ApplicationRole>>(); 

Das war alles funktioniert gut, aber da VS 2017 auf die neueste Version und die Installation von .NET Core 2.0, diese letzte Aktualisierung Codezeile wirft nun die folgende Ausnahme:

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. 

ich, warum die DI-Service-Manager nicht sicher bin, sind nicht mehr in der Lage meine ApplicationRole Klasse zu finden. Ich habe überprüft und alle meine Referenzen verwenden diese Klasse und nicht die Standard-IdentityRole.

Irgendwelche Ideen?

Antwort

15

Sie müssen das IServiceScope selbst erstellen.

Um dies zu tun Sie

var roleManager = serviceProvider.GetService<RoleManager<ApplicationRole>>(); 

mit

IServiceScopeFactory scopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>(); 

using (IServiceScope scope = scopeFactory.CreateScope()) { 
    RoleManager<IdentityRole> roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>(); 

    // Seed database code goes here 
} 
+2

Dank ersetzen! Ich denke, viele Dinge haben sich in 2.0 geändert und die Dokumentation da draußen gibt es noch in Windeln :) – Bmelca

+1

Nicht Windeln, eher wie der Mülleimer. Ich bin vom .NET Core Team mit der neuesten Version enttäuscht. Es ist Pflaume erbärmlich. – Keith

+0

@Manos, vielen Dank für diese Antwort. Das Verrückte daran ist, dass ich ein wenig in den Mund gekackt habe, während ich über die Tatsache nachdachte, dass das .NET Core-Team es für sinnvoller hielt, mehr Codezeilen hinzuzufügen, um eine Funktion auszuführen, die eine einzige Codezeile benötigte. Wieder so enttäuscht (per meinem Kommentar oben) – Keith

Verwandte Themen