在Db Initializer的Seed方法中创建Asp.net Identity用户

Muh*_*hid 16 entity-framework entity-framework-6 asp.net-identity asp.net-identity-2

我先用EF 6代码创建了我的数据层,然后通过继承SeedEvInitializer类方法填充db DropCreateDatabaseIfModelChanges.Seed方法的实现是

protected override void Seed(EvContext context)
{
   //Add other entities using context methods
   ApplicationUserManager manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context));
   var user = new ApplicationUser { Email = "admin@myemail.com" ,UserName = "admin@myemail.com"};
   var result = await manager.CreateAsync(user, "Temp_123");//this line gives error. obviously await cannot be used in non- async method and I cannot make Seed async
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我如何Seed使用UserManager类在方法中添加用户.当我更改 var result = awit manager.CreateAsync(user, "Temp_123");

var result = manager.CreateAsync(user, "Temp_123").Result; //or .Wait
应用程序时无限期挂起

tmg*_*tmg 19

在asp.net-identity-2中,usermanager具有非异步方法来创建.

var user = new ApplicationUser { Email = "admin@myemail.com", UserName = "admin@myemail.com" };
manager.Create(user, "Temp_123");
Run Code Online (Sandbox Code Playgroud)

如果您想创建"admin"角色,则对于rolemanager也是如此.

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
roleManager.Create(new Role("admin"));
Run Code Online (Sandbox Code Playgroud)

让用户管理员

manager.AddToRole(user.Id, "admin");
Run Code Online (Sandbox Code Playgroud)

编辑:正如trailmax评论的那样,Create()扩展方法带有Microsoft.AspNet.Identity命名空间,所以不要忘记using Microsoft.AspNet.Identity


小智 7

TMG是正确的 - 有非异步方法可用,这是这种特殊情况下最简单的方法.

但是,一般情况下 - 当您只有一个异步版本的函数可用时,并且您无法将该方法的实现更改为异步时 - 您可以创建一个任务并同步等待它.

所以 - 而不是:

IdentityResult result = await manager.CreateAsync(user, "Temp_123");
Run Code Online (Sandbox Code Playgroud)

你可以编码:

Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
createTask.Wait();
Run Code Online (Sandbox Code Playgroud)

等待完成后,将返回IdentityResult

createTask.Result
Run Code Online (Sandbox Code Playgroud)

您还可以在Wait上设置超时,如下所示:

Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
if (!createTask.Wait(5000)) // Wait up to 5 seconds
{
   // We've timed out waiting - Do some error handling
}
else if (!createTask.Result.Succeeded)
{
  // Creating the user failed - Do some error handling
}
Run Code Online (Sandbox Code Playgroud)