質問: await _signInManager.PasswordSignInAsync(model.Email, model.Password, isPersistent: model.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { /* [...] */ } /* [...] */ } ``` サインインマネージャは`private readonly SignInManager _signInManager;`として宣言され`private readonly SignInManager _signInManager;`コンストラクタを介した依存性注入を介して得られる。 DbContextとIDコンテキストは、以下のコードでサービスとして設定されています。私が知る限り`static`と宣言されるものはありません。 ``` services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("RelaxationDbContext"))); services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders() .AddErrorDescriber(); ``` なぜ私はそこにエラーを起こすのですか?フレームワークにバグがありますか、何か間違っていますか?このエラーが今後発生しないようにするにはどうすればよいですか?
回答: 私はパスワードをハッシュしていないので`HasData`を使って自分の`DbContext`テストユーザをシードする方法を理解できなかったので、私はメインコントローラのコンストラクタでユーザを生成した次のコード ``` var findByEmailAsync = _userManager.FindByEmailAsync("foo@foo.foo"); if (findByEmailAsync.Result == null) _userManager?.CreateAsync(new User() { Id = "37846734-172e-4149-8cec-6f43d1eb3f60", Email = "foo@foo.foo", UserName = "foo@foo.foo" }, "Password_1"); ``` その後、私は現在、電子メールを変更し、ユーザーがログインを再試行した変更を確認した後、「電子メールの変更」機能に取り組んでいます。そして、地獄が来た場所です! ユーザーが電子メールを変更したので`FindByEmailAsync`方法はへの呼び出しにつながるデータベースでそれを見つけることができませんでした`CreateAsync` 。なんらかの理由でこの呼び出しが正しく実行され、時にはクラッシュすることもありますが、ほとんどの場合、ログイン試行中にほとんどいつも`_userManager`への次の呼び出しでアプリケーションがクラッシュします。 私は本当にそれが`duplicate id`代わりに返されるこのエラーである理由を理解していない... 一時的な修正として、データベースにユーザーをシードする方法を理解するまでは、コードの最初の行をこの行に置き換えます`var findByEmailAsync = _userManager.FindByIdAsync("37846734-172e-4149-8cec-6f43d1eb3f60");`