21

Sto cercando di personalizzare ASP.NET Identità 3 in modo che utilizza chiavi intere:Perché questo viola il vincolo di tipo?

public class ApplicationUserLogin : IdentityUserLogin<int> { } 
public class ApplicationUserRole : IdentityUserRole<int> { } 
public class ApplicationUserClaim : IdentityUserClaim<int> { } 

public sealed class ApplicationRole : IdentityRole<int> 
{ 
    public ApplicationRole() { } 
    public ApplicationRole(string name) { Name = name; } 
} 

public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, ApplicationDbContext, int> 
{ 
    public ApplicationUserStore(ApplicationDbContext context) : base(context) { } 
} 

public class ApplicationRoleStore : RoleStore<ApplicationRole, ApplicationDbContext, int> 
{ 
    public ApplicationRoleStore(ApplicationDbContext context) : base(context) { } 
} 

public class ApplicationUser : IdentityUser<int> 
{ 
} 

public sealed class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, int> 
{ 
    private static bool _created; 

    public ApplicationDbContext() 
    { 
    // Create the database and schema if it doesn't exist 
    if (!_created) { 
     Database.AsRelational().Create(); 
     Database.AsRelational().CreateTables(); 
     _created = true; 
    } 
    } 
} 

Questo compila bene, ma poi getta un errore di runtime:

System.TypeLoadException

GenericArguments[0], 'TeacherPlanner.Models.ApplicationUser', on 'Microsoft.AspNet.Identity.EntityFramework.UserStore`4[TUser,TRole,TContext,TKey]' violates the constraint of type parameter 'TUser'.

La firma per UserStore è :

public class UserStore<TUser, TRole, TContext, TKey> 
where TUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser<TKey> 
where TRole : Microsoft.AspNet.Identity.EntityFramework.IdentityRole<TKey> 
where TContext : Microsoft.Data.Entity.DbContext 
where TKey : System.IEquatable<TKey> 

ApplicationUser è proprio un IdentityUser<int>. Non è questo quello che sta cercando?

+1

Hai per caso dichiarato un nuovo tipo nel tuo progetto con lo stesso nome di IdentityUser? Lo faccio a volte selezionando "declare type" invece di "aggiungi using statement" in CodeRush. –

+0

No, appena controllato! – James

risposta

45

Ran in questo problema. Si stava bloccando sul file startup.cs. cambiato

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

a

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

dichiarando il tipo di chiave sembrava superare l'incidente

+0

Avevo paura di dover scavalcare tutte le classi e i metodi di Identity perché ho le chiavi lunghe, ma tutto funziona con questa piccola correzione. Grazie! – Atchitutchuk

9

imbattuto in questo problema pure. Ho dovuto aggiungere anche il tipo di chiave IdentityRole, perché stava ancora lanciando lo stesso errore.

 services.AddIdentity<ApplicationUser, IdentityRole<int>>() 
      .AddEntityFrameworkStores<ApplicationDbContext,int>() 
      .AddDefaultTokenProviders(); 
0

Ho avuto lo stesso problema ora. La correzione era diversa. Quindi postarlo qui. Potrebbe aiutare gli altri.

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

ho dovuto creare una classe vuota per ApplicationRole ereditare IdentityRole<int>.

public class ApplicationRole : IdentityRole<int> 
{ 

}