15

Ho creato il mio livello dati con il codice EF 6 e sto compilando il metodo db tramite Seed della classe EvInitializer che eredita da DropCreateDatabaseIfModelChanges. L'implementazione di Seed metodo èCreazione utente Identità Asp.net nel metodo seme Db Initializer

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 
} 

La mia domanda è come posso aggiungere un utente in Seed metodo utilizzando UserManager classe. 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 a tempo indeterminato

risposta

18

in asp.net-identità-2 usermanager ha metodi non asincrone per creare.

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

Uguale 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 Admin

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

Edit: Come Trailmax commentato, Create() extension method arriva con Microsoft.AspNet.Identity spazio dei nomi, quindi non dimenticate using Microsoft.AspNet.Identity

+0

Non esiste un metodo 'manager.Create'. Ho controllato dai pacchetti installati su nuget e ho la versione 2.1.0 di 'Microsoft.AspNet.Identity.Core'. Qualche idea? –

+0

Ho anche la versione 2.1.0 nel mio progetto e posso navigare a questi 2 metodi di estensione. Forse prova a reinstallare i pacchetti – tmg

+0

Ok, fammi provare e aggiornerò il thread dopo che –

7

TMG è corretta - ci sono non asincrone metodi 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.

Così - invece di:

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

è possibile codificare:

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

Una volta che l'attesa è terminata, l'IdentityResult viene restituito in

createTask.Result 

È possibile anche impostare un timeout nell'attesa, come questo:

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 
} 
Problemi correlati