15

Сначала я создал свой слой данных с кодом EF 6, и я заполняю db через Seed метод класса EvInitializer, наследующий от DropCreateDatabaseIfModelChanges. Реализация Seed метода являетсяСоздание пользователя Identity Asp.net в методе Seed для инициализатора Db

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
зависания приложений на неопределенный срок

ответ

18

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

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

То же самое для ролевого менеджера, если вы хотите создать роль «admin».

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

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

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

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

+0

Не существует метода 'manager.Create'. Я проверил мои установленные пакеты nuget, и у меня есть версия 2.1.0 от Microsoft.AspNet.Identity.Core'. Есть идеи? –

+0

У меня есть версия 2.1.0 тоже в моем проекте, и я могу перейти к тем двум методам расширения. Возможно, попробуйте переустановить пакеты – tmg

+0

Хорошо, позвольте мне попробовать, и я обновлю этот поток после этого. –

7

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

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

Так - вместо:

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

Вы можете код:

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

После того, как Wait закончится, IdentityResult получает вернулся в

createTask.Result 

Вы можете также установить тайм-аут в режиме ожидания:

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 
} 
Смежные вопросы