public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid, UserClaim, UserRole,
UserLogin, RoleClaim, UserToken>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
public class ApplicationUser : IdentityUser<Guid, UserClaim, UserRole, UserLogin>
{
}
public class ApplicationRole : IdentityRole<Guid, UserRole, RoleClaim>
{
}
public class UserRole : IdentityUserRole<Guid>
{
}
public class RoleClaim : IdentityRoleClaim<Guid>
{
}
public class UserClaim : IdentityUserClaim<Guid>
{
}
public class UserLogin : IdentityUserLogin<Guid>
{
}
public class UserToken : IdentityUserToken<Guid>
{
}
Startup.cs
: services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext, Guid>()
.AddDefaultTokenProviders();
All'avvio dell'applicazione, viene generata la seguente eccezione:
GenericArguments [0], 'del.Models.ApplicationUser', su 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4 [TUser, TRole, TContext, TKey]' viola il vincolo del tipo 'TUser'.
Come risolvere questo problema? Sono richieste le classi "
UserRole
, RoleClaim
".
Ho avuto lo stesso problema solo oggi. Sto estendendo pesantemente il sistema Identity per supportare le cose di cui ho bisogno nella mia applicazione. Una delle cose che ho notato è che poiché IdentityUser ha MOLTE diverse classi derivate, non è sempre così semplice come sovrascrivere solo "IdentityUser <>".
Detto questo, l'eccezione viene lanciata in ExtensionMethod "AddEntityFrameworkStores ()". La ragione di ciò è che il metodo di estensione utilizza anche un metodo di helper privato che crea dinamicamente un tipo generico:
userStoreType = typeof(UserStore<,,,>).MakeGenericType(userType, roleType, contextType, keyType);
UserStore <> ha anche molte differenti firme generiche. Ho creato il mio UserStore derivato (ApplicationUserStore) in modo da poter creare il mio ApplicationUserRole. In tal modo, la creazione del tipo generico non funzionerebbe più. Ho dovuto creare la mia versione del metodo di estensione che era:
userStoreType = typeof(ApplicationUserStore<,,,>).MakeGenericType(userType, roleType, contextType, keyType);
Ora, questo non è il tuo problema "esatto", ma sono sicuro al 99% che sia. Potrebbe essere necessario creare il proprio UserStore derivato utilizzando la seguente firma:
public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, ApplicationDbContext, Guid>
{
...
}
Quindi creare una nuova classe di metodo Estensioni che duplica l'originale ma modifica la creazione di UserStore.
public static class IdentityEntityFrameworkBuilderExtensions2
{
public static IdentityBuilder AddEntityFrameworkStores2<TContext>(this IdentityBuilder builder)
where TContext : DbContext
{
builder.Services.TryAdd(GetDefaultServices(builder.UserType, builder.RoleType, typeof(TContext)));
return builder;
}
public static IdentityBuilder AddEntityFrameworkStores2<TContext, TKey>(this IdentityBuilder builder)
where TContext : DbContext
where TKey : IEquatable<TKey>
{
builder.Services.TryAdd(GetDefaultServices(builder.UserType, builder.RoleType, typeof(TContext), typeof(TKey)));
return builder;
}
private static IServiceCollection GetDefaultServices(Type userType, Type roleType, Type contextType, Type keyType = null)
{
Type userStoreType;
Type roleStoreType;
keyType = keyType ?? typeof(string);
userStoreType = typeof(ApplicationUserStore<,,,>).MakeGenericType(userType, roleType, contextType, keyType);
roleStoreType = typeof(ApplicationRoleStore<,,>).MakeGenericType(roleType, contextType, keyType);
var services = new ServiceCollection();
services.AddScoped(
typeof(IUserStore<>).MakeGenericType(userType),
userStoreType);
services.AddScoped(
typeof(IRoleStore<>).MakeGenericType(roleType),
roleStoreType);
return services;
}
}
Speriamo che questo aiuti.