tag route net for asp asp.net asp.net-identity type-constraints asp.net-identity-3

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