最初に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
アプリケーションが無期限にハングする
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
_を忘れないでください
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
}