Создание пользователя 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
}