asp.net - route - ¿Por qué esto viola la restricción de tipo?
select asp-for asp-items (3)
Estoy tratando de personalizar ASP.NET Identity 3 para que use claves de enteros:
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;
}
}
}
Esto compila bien, pero luego arroja un error de tiempo de ejecución:
System.TypeLoadException
Genera los argumentos [0], ''TeacherPlanner.Models.ApplicationUser'', en ''Microsoft.AspNet.Identity.EntityFramework.UserStore`4 [TUser, Trole, TContext, TKey]'' viola la restricción de tipo de parámetro ''TUser''.
La firma para UserStore
es:
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
es precisamente un IdentityUser<int>
. ¿No es esto lo que está buscando?
Me encontré con este problema también. También tuve que agregar el tipo de clave IdentityRole , porque todavía estaba lanzando el mismo error.
services.AddIdentity<ApplicationUser, IdentityRole<int>>()
.AddEntityFrameworkStores<ApplicationDbContext,int>()
.AddDefaultTokenProviders();
Me encontré con este problema. Se estaba estrellando en el archivo startup.cs. cambiado
services.AddIdentity<ApplicationUser, ApplicationIdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
a
services.AddIdentity<ApplicationUser, ApplicationIdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext,int>()
.AddDefaultTokenProviders();
Declarar el tipo de clave parecía superar el accidente
Tengo el mismo problema ahora. La solución era diferente. Por lo tanto publicarlo aquí. Podría ayudar a los demás.
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext,int>()
.AddDefaultTokenProviders();
Tuve que crear una clase vacía para ApplicationRole
heredando IdentityRole<int>
.
public class ApplicationRole : IdentityRole<int>
{
}