2014-05-09 6 views
14

J'ai rencontré un problème pour l'amorçage de la base de données avec Identity v2. J'ai séparé le IdentityModel du projet MVC5 à mon Data Access Layer où j'ai également installé les Migrations EF. Donc, je commentais le code qui utilisent l'intérieur « IdentityConfig.cs » pour créer l'utilisateur initial et de mettre le code dans ma base de données de semences qui ressemble à ceciBase de données de départ pour 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); 
      } 
     } 

Maintenant, quand je suis en cours d'exécution mise à jour base de données de commande, je suis un erreur

Value cannot be null. 
Parameter name: manager 

Il ressemble, j'obtiens nulle dans ces deux lignes de code

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

Toute suggestion s'il vous plaît?

+4

Regardez ligne 51 ici: https://raw.githubusercontent.com/OdeToCode/MVC5_Samples/master/identity/BasicIdentityWithDiagrams /Migrations/Configuration.cs Je ne pense pas que vous aurez du succès en utilisant Owin dans la méthode Seed à moins que vous ne lanciez Seed depuis l'application. Owin ne sera pas disponible ou configuré si vous exécutez Seed à partir de la console du gestionnaire de packages. – OdeToCode

Répondre

25

C'est la façon d'éviter d'utiliser un contexte 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

Je suis arrivé ce travail en utilisant:

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

Salut Sous la classe de démarrage s'il vous plaît assurez-vous que vous avez appelez application .CreatePerOwinContext (ApplicationDbContext.Create); app.CreatePerOwinContextApplicationUserManager.Create); app.CreatePerOwinContextApplicationSignInManager.Create);

app.CreatePerOwinContext (ApplicationRoleManager.Create);

0

Les dernières nouveautés sont toutes asynchrones & utilisations Revendications. Voici ce que a fonctionné pour moi avec les migrations pour ajouter un super-utilisateur si aucun existe ...

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(); 
     } 
    } 
Questions connexes