I have created my data layer with EF 6 code first and I am populating the db through Seed
method of EvInitializer
class inheriting from DropCreateDatabaseIfModelChanges
. The implementation of Seed
method is
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
}
My question is how I can add a user in Seed
method using UserManager
class. when I change
var result = awit manager.CreateAsync(user, "Temp_123");
to
var result = manager.CreateAsync(user, "Temp_123").Result; //or .Wait
the application hangs indefinitely
In asp.net-identity-2 usermanager has non async methods to create.
var user = new ApplicationUser { Email = "admin@myemail.com", UserName = "admin@myemail.com" };
manager.Create(user, "Temp_123");
Same for rolemanager if you want to create "admin" role.
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
roleManager.Create(new Role("admin"));
make the user admin
manager.AddToRole(user.Id, "admin");
Edit: As trailmax commented, Create()
extension method comes in with Microsoft.AspNet.Identity
namespace so do not forget using Microsoft.AspNet.Identity
TMG is correct - there are non-async methods available, and that's the easiest way in this particular case.
In general, however - when you you only have an async version of a function available to you, and you can't change the implementation of the method to be Async - you can create a task and wait for it synchronously.
So - instead of:
IdentityResult result = await manager.CreateAsync(user, "Temp_123");
You can code:
Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
createTask.Wait();
Once the Wait has finished, the IdentityResult gets returned in
createTask.Result
You can also set a timeout on the Wait, like this:
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
}