2014-01-12 37 views
1

我正在构建使用Code First迁移的MVC 5应用程序,并尝试使用默认管理员用户种子我的数据库。我可能在这里做出了错误的假设,但我认为我需要使用异步方法来添加用户和角色,因为我收到了以前不存在的用户错误。现在,当我在软件包管理器控制台中运行update-database命令时,它将崩溃Visual Studio 2013。我很茫然。ASP.NET MVC 5应用程序种子方法崩溃Visual Studio 2013添加默认用户和角色

我没有收到崩溃之前的错误,我还没有想出如何调试在PMC中运行的代码。下面是我的种方法的代码:

 //Add default users here: 
     var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 
     var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 
     var silkster = new NewUser() { UserName = "silkster", Password = "Passw0rd!", Email = "[email protected]", Roles = new List<string>() { "Admin" } }; 

     var defaultUser = await UserManager.FindByNameAsync(silkster.UserName); 
     var newUserResult = IdentityResult.Success; 

     if (defaultUser == null) 
     { 
      var user = new ApplicationUser() { UserName = silkster.UserName, Email = silkster.Email }; 
      newUserResult = await UserManager.CreateAsync(user, silkster.Password); 
     } 

     if (newUserResult == IdentityResult.Success) 
     { 
      var results = new List<IdentityResult>(); 
      IdentityResult result; 
      foreach (string role in silkster.Roles) 
      { 
       if (!RoleManager.RoleExists(role)) 
       { 
        result = await RoleManager.CreateAsync(new IdentityRole(role)); 
        results.Add(result); 
       } 
       result = await UserManager.AddToRoleAsync(silkster.UserName, role); 
       results.Add(result); 
      } 
     } 
+0

我有一个电子邮件字段延长ApplicationUser和我加了简单对象NewUser包含默认用户的种子数据。 – Silkster

回答

2

我发现了一些信息here,帮助我解决我的Visual Studio崩溃问题。

添加了此方法Configuration.cs:

protected async Task<bool> AddRoleAndUser(ZTTDD.Models.ApplicationDbContext context, NewUser newUser) 
    { 
     var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 
     var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 
     IdentityResult result = IdentityResult.Success; 

     var user = UserManager.FindByName(newUser.UserName); 

     if (user != null) 
     { 
      user = new ApplicationUser() { UserName = newUser.UserName, Email = newUser.Email }; 
      result = await UserManager.CreateAsync(user, newUser.Password); 

      if (!result.Succeeded) 
       Console.Write("Unable to create user: " + newUser.UserName); 
       return false; 

     } 

     foreach (string r in newUser.Roles) 
     { 
      if (!RoleManager.RoleExists(r)) 
      { 
       var role = new IdentityRole(r); 
       result = await RoleManager.CreateAsync(role); 
       if (!result.Succeeded) 
        Console.Write("Unable to create role: " + r); 
        return false; 
      } 

      result = await UserManager.AddToRoleAsync(user.Id, r); 
      if (!result.Succeeded) 
      { 
       Console.Write("Unable to add user '" + newUser.UserName + "' to role '" + r + "'."); 
      } 
     } 

     return result.Succeeded; 
    } 

然后我重构我的代码在种子的方法,像这样:

 var silkster = new NewUser() { UserName = "silkster", Password = "Passw0rd!", Email = "[email protected]", Roles = new List<string>() { "Admin" } }; 
     var seedUserSuccess = await AddRoleAndUser(context, silkster); 
     if (!seedUserSuccess) 
     { 
      Console.Write("Seeding failed for user: " + silkster.UserName); 
     } 
+0

我很好奇为什么Conosle.Write()语句不写入PMC,即使使用-verbose标志。 – Silkster

+0

另外,我留下的唯一问题是用户未添加到角色中。有任何想法吗? – Silkster

+0

新问题:将其更改为循环列表(),现在又崩溃了VS2013。 – Silkster

相关问题