ASP.NET 5アプリケーションで初期の「スーパーユーザー」を作成しようとしています。 MVC 6/EF7で最新のテンプレートファイルを使用する。ASP.NET 5 Startup.csのユーザーをAsyncでシードする方法
私はここに設定の例に従うことができます:
http://wildermuth.com/2015/3/17/A_Look_at_ASP_NET_5_Part_3_-_EF7
これは正常に動作します - 私は非同期メソッドを実行しようとするまで。
await _userManager.CreateAsync(user, "[email protected]!");
またはさらに:例えば
await _context.SaveChangesAsync();
同期方法は問題なく動作し、このコードは、同様Startup.cs Configure{...}
の外に実行します。
アプリケーション開始時に「死の白いスクリーン」が表示されます。私は非同期なしですべてそれを行うだろうが、私はUserManagerがアイデンティティ3.0のCreate()
を持っているとは思わない。
これは非同期プログラミングを理解していないのですか、それとも可能でしょうか?
EDIT:それを呼び出す
public void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient<Seeder>();
...
}
:
ユーザーを作成しSeeder
クラスとメソッドを定義します:
public class Seeder
{
private ApplicationDbContext _context;
private UserManager<ApplicationUser> _userManager;
public Seeder(
ApplicationDbContext context,
UserManager<ApplicationUser> userManager)
{
_context = context;
_userManager = userManager;
}
public async Task Seed()
{
await CreateUsersAsync();
}
public async Task CreateUsersAsync()
{
var user = await _userManager.FindByEmailAsync("[email protected]");
if (user == null)
{
var company = _context.Company.First(x => x.Name == "Acme Ltd");
user = new ApplicationUser
{
UserName = "[email protected]",
Email = "[email protected]",
CreatedDate = DateTime.Now,
IsActive = true,
CompanyID = company.CompanyId
};
await _userManager.CreateAsync(user, "[email protected]!!");
}
}
}
設定サービス全体の呼び出しを追加しました:
public async void Configure(Seeder seeder)
{
...
await seeder.Seed();
...
}
面白いのは、それは実際にユーザーを作成します - 単に続行しません。したがって、2回目にuser != null
が実行され、正常に実行されます。
'_userManager.CreateAsnyc'メソッド呼び出し全体を共有してください。コントローラコードはどのように見えますか? –
私はUserManagerの非同期呼び出しがメソッドが成功したかどうかを示すIdentityResultオブジェクトを返します。そのオブジェクトには、ユーザーを保持するResultプロパティがあります。 –