web-dev-qa-db-ja.com

Seed DbInitializerのメソッド)でAsp.netIdentityユーザーを作成する

最初にEF6コードを使用してデータレイヤーを作成し、Seedから継承するEvInitializerクラスのDropCreateDatabaseIfModelChangesメソッドを介してデータベースにデータを入力しています。 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 = "[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
アプリケーションが無期限にハングする

16

Asp.net-identity-2では、usermanagerに作成する非同期メソッドがありません。

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

「admin」ロールを作成する場合は、rolemanagerについても同じです。

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

ユーザーを管理者にする

_manager.AddToRole(user.Id, "admin");
_

編集:trailmaxがコメントしたように、Create()拡張メソッドは_Microsoft.AspNet.Identity_名前空間に付属しているので、_using Microsoft.AspNet.Identity_を忘れないでください

19
tmg

TMGは正しいです-利用可能な非同期メソッドがあり、それはこの特定のケースで最も簡単な方法です。

ただし、一般的には、使用できる関数の非同期バージョンしかなく、メソッドの実装を非同期に変更できない場合は、タスクを作成して同期的に待機できます。

だから-代わりに:

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

次のコードを記述できます。

Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
createTask.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
}
7
Steven Cowles