Создание пользователя Identity Asp.net в методе Seed для инициализатора Db

Сначала я создал свой слой данных с кодом EF 6, и я заполняю метод db через Seed класса EvInitializer, наследующий от 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 = "[email protected]" ,UserName = "[email protected]"};
   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
}

Мой вопрос заключается в том, как я могу добавить пользователя в метод Seed, используя класс UserManager. когда я меняю var result = awit manager.CreateAsync(user, "Temp_123");
для изображения var result = manager.CreateAsync(user, "Temp_123").Result; //or .Wait
приложение зависает бесконечно

Ответы

Ответ 1

В asp.net-identity-2 у usermanager есть неасинхронные методы для создания.

var user = new ApplicationUser { Email = "[email protected]", UserName = "[email protected]" };
manager.Create(user, "Temp_123");

То же самое для rolemanager, если вы хотите создать роль "admin".

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
roleManager.Create(new Role("admin"));

сделать администратором пользователя

manager.AddToRole(user.Id, "admin");

Изменить: как прокомментировал trailmax, метод расширения Create() входит в пространство имен Microsoft.AspNet.Identity, поэтому не забывайте using Microsoft.AspNet.Identity

Ответ 2

TMG верна - существуют неасинхронные методы, и это самый простой способ в этом конкретном случае.

В общем, однако - когда у вас есть только асинхронная версия функции, доступной для вас, и вы не можете изменить реализацию метода Async - вы можете создать задачу и ждать ее синхронно.

Итак - вместо:

IdentityResult result = await manager.CreateAsync(user, "Temp_123");

Вы можете указать:

Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
createTask.Wait();

Как только Wait закончит, IdentityResult будет возвращен в

createTask.Result

Вы также можете установить тайм-аут в 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
}