Asp.net Identity 2.0 更新ユーザー 質問する

Asp.net Identity 2.0 更新ユーザー 質問する

ユーザーの名前の変更など、データベースへのユーザー変更の保存に問題があります。個人認証を使用して新しい VS2013 Web プロジェクトで自動的に作成される IdentityModel を使用しています。残念ながら、テンプレートではロールの変更以外のユーザー情報を変更できません。Google で調べていますが、あまり見つかりません。ベース ID コードを使用して更新を実装している人はいますか?

私が見つけた最も近いものはこれです:

ユーザーデータの更新 - Asp.net Identity

デフォルトのテンプレートを組み込むことに成功していません。今週から Identity を使い始めたばかりなので、私の理解不足が問題なのかもしれません。

var updatedUser = new ApplicationUser
            {
                Id = model.UserId,
                UserName = model.UserName,
                CustomerId = model.CustomerId,
                Email = model.EmailAddress,
                FirstName = model.FirstName,
                LastName = model.LastName,
                PhoneNumber = model.PhoneNumber,                    
            };

...
var result = await UserManager.UpdateAsync(updatedUser);

私の UserManager は次のように作成されます:

return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();

ブラウザに次のエラーが表示されます。

同じタイプの別のエンティティがすでに同じ主キー値を持っているため、タイプ 'ApplicationUser' のエンティティの添付に失敗しました。これは、グラフ内のいずれかのエンティティに競合するキー値がある場合に、'Attach' メソッドを使用するか、エンティティの状態を 'Unchanged' または 'Modified' に設定すると発生することがあります。これは、一部のエンティティが新しく、データベース生成のキー値をまだ受け取っていないことが原因である可能性があります。この場合は、'Add' メソッドまたは 'Added' エンティティ状態を使用してグラフを追跡し、新しいエンティティ以外の状態を必要に応じて 'Unchanged' または 'Modified' に設定します。

ありがとう

ベストアンサー1

私が抱えていた問題は、ApplicationUser を作成し、そのオブジェクトをデータベースに保存したことでした。Identity は内部で Entity Framework を使用しているため、「updatedUser」オブジェクトのエンティティ状態は Added です。そのため、Entity Framework は Identity データベースに INSERT しようとし、競合が発生しました。そのため、ユーザーを取得して更新する必要があります。返されたユーザーオブジェクトEntity Framework がエンティティの状態が変更済みであることを認識できるようにします。動作コードは次のとおりです。

var user = await UserManager.FindByIdAsync(model.UserId);

user.Email = model.EmailAddress;
user.CustomerId = model.CustomerId;
user.FirstName = model.FirstName;
user.PhoneNumber = model.PhoneNumber;
user.LastName = model.LastName;

var result = await UserManager.UpdateAsync(user);

おすすめ記事