Il tipo di entity framework IdentityRole non fa parte del modello per il contesto corrente dopo l’estensione della tabella dei ruoli

Ho esteso il mio AspNetRoles che è stato creato da Entity Framework per assomigliare a questo:

public class AspNetRoles:IdentityRole { public AspNetRoles() : base() { } public String Label { get; set; } public String ApplicationId { get; set; } public AspNetApplications Application { get; set; } public static readonly String SystemAdministrator = "SystemAdministrator"; } 

Ho capito che, poiché ho esteso il tavolo Identity, ho dovuto apportare modifiche al mio usermanager. Questo è quello che ho fatto:

 public class ApplicationUserManager : UserManager { public ApplicationUserManager(IUserStore store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore(context.Get())); // Configure validation logic for usernames manager.UserValidator = new UserValidator(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; // Configure validation logic for passwords manager.PasswordValidator = new PasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = true, RequireDigit = true, RequireLowercase = true, RequireUppercase = true, }; // Configure user lockout defaults manager.UserLockoutEnabledByDefault = true; manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); manager.MaxFailedAccessAttemptsBeforeLockout = 5; // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user // You can write your own provider and plug it in here. manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider { MessageFormat = "Your security code is {0}" }); manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider { Subject = "Security Code", BodyFormat = "Your security code is {0}" }); manager.EmailService = new EmailService(); manager.SmsService = new SmsService(); var dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider != null) { manager.UserTokenProvider = new DataProtectorTokenProvider(dataProtectionProvider.Create("ASP.NET Identity")); } return manager; } } // Configure the application sign-in manager which is used in this application. public class ApplicationSignInManager : SignInManager { public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) { } public override Task CreateUserIdentityAsync(ApplicationUser user) { return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager); } public static ApplicationSignInManager Create(IdentityFactoryOptions options, IOwinContext context) { return new ApplicationSignInManager(context.GetUserManager(), context.Authentication); } } public class ApplicationRoleManager : RoleManager, IDisposable { public ApplicationRoleManager(RoleStore store) : base(store) { } public static ApplicationRoleManager Create(IdentityFactoryOptions options, IOwinContext context) { //AppIdentityDbContext db = context.Get(); //AppRoleManager manager = new AppRoleManager(new RoleStore(db)); return new ApplicationRoleManager(new RoleStore(context.Get())); //return manager; } } public class ApplicationUserStore : UserStore, IUserStore, IUserStore, IDisposable where TUser : IdentityUser { public ApplicationUserStore(DbContext context) : base(context) { } } 

Questo è il mio DBContext:

 public class ApplicationDbContext : IdentityDbContext { public virtual DbSet AspNetUsersExtendedDetails { get; set; } public virtual DbSet AspNetApplications { get; set; } public virtual DbSet AspNetEventLogs { get; set; } public ApplicationDbContext() : base("AppStudio") { } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } } 

Tuttavia, ottengo questo errore quando avvio la mia applicazione:

Il tipo di quadro IdentityRole non fa parte del modello per il contesto corrente.

Non sono sicuro del motivo per cui questo sta accadendo. Ho perso qualcosa che deve essere cambiato dopo aver esteso la mia tabella dei ruoli?

Risposta breve

Il problema principale nel codice precedente è nel metodo Create di UserManager . In questo metodo, è necessario creare un UserManager utilizzando un UserStore che è a conoscenza della nuova class di ruolo creata. Per fare ciò, puoi usare un’istanza della class ApplicationUserStore che hai o creare un nuovo user store in questo modo:

 new UserStore()) 

Come aggiungere una proprietà personalizzata a IdentityRole?

Per aggiungere una nuova proprietà a IdentityRole , puoi seguire i seguenti passi:

  1. Creare un’applicazione Web ASP.NET
  2. Assicurati di selezionare MVC e l’ autenticazione è account utente individuale
  3. Vai alla cartella Modelli → Apri IdentityModels.cs e crea una class ApplicationRole contenente la proprietà personalizzata che vuoi aggiungere:

     public class ApplicationRole : IdentityRole //My custom role class { public string ApplicationId { get; set; } //My custom property } 
  4. Modificare il metodo GenerateUserIdentityAsync di ApplicationUser per accettare il parametro di tipo UserManager :

     public class ApplicationUser : IdentityUser { public async Task GenerateUserIdentityAsync(UserManager manager) { 
  5. Modificare la class base ApplicationDbContext e introdurre tutti i parametri generici:

     public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext() : base("DefaultConnection") { 
  6. Costruisci il progetto.

  7. Vai al menu TOOLSNuget Package Manager → fai clic su Package Manager Console
  8. Immettere Enable-Migrations e premere Invio e attendere fino al completamento dell’attività.
  9. Digitare Add-Migration "ApplicationRole" e premere Invio e attendere fino al completamento dell’attività.
  10. Digitare Update-Database e premere Invio e attendere fino al completamento dell’attività.
  11. Vai alla cartella App_Start → Apri IdentityConfig.cs e cambia la class ApplicationUserManager per derivare da UserManager e cambia anche il suo metodo Create per restituire un UserManage conoscenza di ApplicationRole :

     public class ApplicationUserManager : UserManager { public ApplicationUserManager(IUserStore store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore(context.Get())); 
  12. Per gestire i ruoli, creare la class ApplicationRoleManager nello stesso file:

     public class ApplicationRoleManager : RoleManager { public ApplicationRoleManager(IRoleStore store) : base(store) { } public static ApplicationRoleManager Create( IdentityFactoryOptions options, IOwinContext context) { return new ApplicationRoleManager(new RoleStore(context.Get())); } } 
  13. Vai alla cartella App_Start → Apri Startup.Auth.cs e aggiungi il seguente codice al metodo ConfigureAuth :

     ConfigureAuthapp.CreatePerOwinContext(ApplicationRoleManager.Create); 

Ora il progetto è pronto per sfruttare il nuovo ApplicationRole .