2014-05-09 20 views
14

Tôi đã gặp một vấn đề về việc gieo hạt cơ sở dữ liệu với Identity v2. Tôi tách ra IdentityModel từ dự án MVC5 sang Lớp Truy cập Dữ liệu của tôi, nơi tôi cũng cài đặt EF Migrations. Vì vậy, tôi nhận xét ra mã mà sử dụng bên trong "IdentityConfig.cs" để tạo người dùng ban đầu và đặt mã bên trong cơ sở dữ liệu hạt giống của tôi trông như thế nàyCơ sở dữ liệu về Seed cho 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); 
      } 
     } 

Bây giờ khi tôi chạy lệnh update-cơ sở dữ liệu, tôi nhận được lỗi

Value cannot be null. 
Parameter name: manager 

Dường như, tôi nhận được null trong hai dòng sau mã

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

Bất kỳ đề nghị xin vui lòng?

+4

Nhìn vào dòng 51 ở đây: https://raw.githubusercontent.com/OdeToCode/MVC5_Samples/master/identity/BasicIdentityWithDiagrams /Migrations/Configuration.cs Tôi không nghĩ bạn sẽ thành công khi sử dụng Owin trong phương thức Seed trừ khi bạn đang chạy Seed từ bên trong ứng dụng. Owin sẽ không ở xung quanh hoặc được cấu hình nếu bạn chạy Seed từ giao diện quản lý gói. – OdeToCode

Trả lời

25

Đây là cách để tránh sử dụng một bối cảnh 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

tôi đã làm việc này bằng cách sử dụng:

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 Dưới lớp Startup hãy chắc chắn rằng bạn có gọi ứng dụng .CreatePerOwinContext (ApplicationDbContext.Create); app.CreatePerOwinContextApplicationUserManager.Create); app.CreatePerOwinContextApplicationSignInManager.Create);

app.CreatePerOwinContext (ApplicationRoleManager.Create);

0

Nội dung mới nhất là tất cả không đồng bộ & sử dụng Xác nhận quyền sở hữu. Đây là những gì làm việc cho tôi với di cư để thêm một người dùng siêu nếu không tồn tại ...

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(); 
     } 
    } 
Các vấn đề liên quan