2014-05-09 22 views
14

Mi sono imbattuto in un problema di seeding del database con Identity v2. Ho separato IdentityModel dal progetto MVC5 al mio Data Access Layer dove ho impostato anche le Migrazioni EF. Così ho commentato il codice che utilizzano "IdentityConfig.cs" all'interno per creare utente iniziale e mettere il codice all'interno mio database seme che assomiglia a questoDatabase di semi per Identity 2

protected override void Seed(Repository.DataContext.IdentityDb context) 
     { 

      // var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
      // var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>(); 
      var owinContext = new OwinContext(); 
      var userManager = owinContext.GetUserManager<ApplicationUserManager>(); 
      var roleManager = owinContext.Get<ApplicationRoleManager>(); 
      const string name = "[email protected]"; 
      const string password = "[email protected]"; 
      const string roleName = "Admin"; 

      // //Create Role Admin if it does not exist 
      var role = roleManager.FindByName(roleName); 
      if (role == null) 
      { 
       role = new IdentityRole(roleName); 
       var roleresult = roleManager.Create(role); 
      } 

      var user = userManager.FindByName(name); 
      if (user == null) 
      { 
       user = new ApplicationUser { UserName = name, Email = name }; 
       var result = userManager.Create(user, password); 
       result = userManager.SetLockoutEnabled(user.Id, false); 
      } 

      // // Add user admin to Role Admin if not already added 
      var rolesForUser = userManager.GetRoles(user.Id); 
      if (!rolesForUser.Contains(role.Name)) 
      { 
       var result = userManager.AddToRole(user.Id, role.Name); 
      } 
     } 

Ora, quando sto facendo funzionare comando update-base di dati, ho ottenuto un errore di

Value cannot be null. 
Parameter name: manager 

sembra, sto ottenendo nulla in queste due righe di codice

var userManager = owinContext.GetUserManager<ApplicationUserManager>(); 
var roleManager = owinContext.Get<ApplicationRoleManager>(); 

Qualsiasi suggerimento per favore?

+4

Look at Linea 51 qui: https://raw.githubusercontent.com/OdeToCode/MVC5_Samples/master/identity/BasicIdentityWithDiagrams /Migrations/Configuration.cs Non penso che avrai successo usando Owin nel metodo Seed a meno che tu non stia utilizzando Seed all'interno dell'app. Owin non sarà in giro o configurato se si esegue Seed dalla console del gestore pacchetti. – OdeToCode

risposta

25

Questo è il modo per evitare di usare un contesto OWIN:

protected override void Seed(Repository.DataContext.IdentityDb context) 
    var roleStore = new RoleStore<IdentityRole>(context); 
    var roleManager = new RoleManager<IdentityRole>(roleStore); 
    var userStore = new UserStore<ApplicationUser>(context); 
    var userManager = new UserManager<ApplicationUser>(userStore);    
    var user = new ApplicationUser { UserName = "sallen" }; 

    userManager.Create(user, "password");      
    roleManager.Create(new IdentityRole { Name = "admin" }); 
    userManager.AddToRole(user.Id, "admin"); 
} 
1

Ho ottenuto questo lavoro utilizzando:

protected override void Seed(ApplicationDbContext context) 
     { 
      context.Configuration.LazyLoadingEnabled = true; 

      //var userManager = HttpContext.Current 
      // .GetOwinContext().GetUserManager<ApplicationUserManager>(); 

      //var roleManager = HttpContext.Current 
      // .GetOwinContext().Get<ApplicationRoleManager>(); 

      var roleStore = new RoleStore<ApplicationRole, int, ApplicationUserRole>(context); 
      var roleManager = new RoleManager<ApplicationRole, int>(roleStore); 
      var userStore = new UserStore<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>(context); 
      var userManager = new UserManager<ApplicationUser, int>(userStore); 
... 
0

Hi Sotto la classe di avvio si prega di assicurarsi di avere chiamare app .CreatePerOwinContext (ApplicationDbContext.Create); app.CreatePerOwinContextApplicationUserManager.Create); app.CreatePerOwinContextApplicationSignInManager.Create);

app.CreatePerOwinContext (ApplicationRoleManager.Create);

0

Le ultime notizie sono tutte asincrone & utilizza Reclami. Ecco che cosa ha funzionato per me con le migrazioni di aggiungere un utente eccellente se non esiste ...

protected override void Seed(Holos.Service.Models.ApplicationDbContext context) 
    { 
     var email  = "[email protected]"; 
     var password = "xxxxx"; 
     var userStore = new UserStore<ApplicationUser>(context); 
     var userManager = new ApplicationUserManager(userStore); 

     var user = userManager.FindByEmailAsync(email).Result; 
     if (user == null) 
     { 
      var adminUser = new ApplicationUser() { Email = email, UserName = email }; 
      var result = userManager.CreateAsync(adminUser, password); 
      result.Wait(); 
      userManager.AddClaimAsync(adminUser.Id, new Claim("Read", "*")).Wait(); 
      userManager.AddClaimAsync(adminUser.Id, new Claim("Create", "*")).Wait(); 
      userManager.AddClaimAsync(adminUser.Id, new Claim("Update", "*")).Wait(); 
      userManager.AddClaimAsync(adminUser.Id, new Claim("Delete", "*")).Wait(); 
      userManager.AddClaimAsync(adminUser.Id, new Claim("UserType", "SuperUser")).Wait(); 
     } 
    } 
Problemi correlati