15

ich meine Datenschicht zunächst mit EF 6 Code erstellt haben, und ich bin mit dem db durch Seed Methode der EvInitializer Klasse von DropCreateDatabaseIfModelChanges vererben bevölkern. Die Umsetzung der Seed Methode istErstellen Asp.net Identität Benutzer in Seed-Methode von 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 
} 

Meine Frage ist, wie ich einen Benutzer in Seed Methode UserManager-Klasse hinzufügen. wenn ich var result = awit manager.CreateAsync(user, "Temp_123");
zu
var result = manager.CreateAsync(user, "Temp_123").Result; //or .Wait
die Anwendung hängt unbegrenzt

Antwort

18

In asp.net-Identität-2 Usermanager hat nicht async Methoden ändern zu erstellen.

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

Das Gleiche gilt für rolemanager, wenn Sie „admin“ Rolle erstellen möchten.

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

machen den Benutzer admin

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

Edit: Wie Trailmax kommentiert, kommt Create() Extension-Methode in mit Microsoft.AspNet.Identity Namespace so nicht using Microsoft.AspNet.Identity

+0

Es gibt keine 'manager.Create' Methode. Ich habe von meinen installierten nugget-Paketen überprüft und ich habe Version 2.1.0 von 'Microsoft.AspNet.Identity.Core'. Irgendwelche Ideen? –

+0

Ich habe auch Version 2.1.0 in meinem Projekt und ich kann zu diesen 2 Erweiterungsmethoden navigieren. Vielleicht versuchen Sie erneut Pakete installieren – tmg

+0

Ok, lassen Sie mich das versuchen und ich werde den Thread danach aktualisieren –

7

TMG vergessen korrekt ist - es gibt nicht-Asynchron Methoden verfügbar, und das ist der einfachste Weg in diesem speziellen Fall.

Im Allgemeinen jedoch - wenn Ihnen nur eine asynchrone Version einer Funktion zur Verfügung steht und Sie die Implementierung der Methode nicht als Async ändern können - können Sie eine Aufgabe erstellen und synchron darauf warten.

So - statt:

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

können Sie Code:

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

Sobald das Warten beendet hat, wird die IdentityResult zurück in

createTask.Result 

können Sie auch festlegen ein Timeout beim Warten, so:

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 
} 
Verwandte Themen