Ho creato il mio livello dati con il codice EF 6 e sto popolando il metodo db through Seed
della classe EvInitializer
eredita da DropCreateDatabaseIfModelChanges
. L'implementazione del metodo 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
}
La mia domanda è come posso aggiungere un utente nel metodo Seed
usando la classe UserManager
. quando cambio var result = awit manager.CreateAsync(user, "Temp_123");
a
var result = manager.CreateAsync(user, "Temp_123").Result; //or .Wait
l'applicazione si blocca indefinitamente
In asp.net-identity-2 usermanager non ha metodi asincroni da creare.
var user = new ApplicationUser { Email = "admin@myemail.com", UserName = "admin@myemail.com" };
manager.Create(user, "Temp_123");
Lo stesso per rolemanager se si desidera creare il ruolo "admin".
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
roleManager.Create(new Role("admin"));
rendere l'utente amministratore
manager.AddToRole(user.Id, "admin");
Modifica: con il commento di trailmax, il metodo di estensione Create()
entra in Microsoft.AspNet.Identity
namespace quindi non dimenticare di using Microsoft.AspNet.Identity
TMG è corretto - ci sono metodi non asincroni disponibili, e questo è il modo più semplice in questo caso particolare.
In generale, tuttavia, quando si dispone solo di una versione asincrona di una funzione e non è possibile modificare l'implementazione del metodo in Async, è possibile creare un'attività e attendere in modo sincrono.
Quindi - invece di:
IdentityResult result = await manager.CreateAsync(user, "Temp_123");
Puoi codificare:
Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
createTask.Wait();
Una volta terminata l'attesa, IdentityResult viene restituito
createTask.Result
Puoi anche impostare un timeout sull'Attesa, in questo modo:
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
}