質問: null || user.UserId != id) { return BadRequest(); } userRepository.Update(user); return new NoContentResult(); } ``` 今、リクエストを発行すると、 `_context.Attach(entity)`行に1つのエラーが発生します。同じキーがトラッキングされている別のエンティティが既に存在するため、トラッキングするエンティティを追加できないという例外があります。 デバッグ時に私がいるのを見`contextEntry.State`に設定された`Unchanged` 。したがって、 *明らか*に`EntityState.Dettached`と等しくはありません。それでも、実行は`if`ステートメント内に入り、エンティティをアタッチしようとしました。 ここでは何かが間違っています。これはバグですか?あるいは私は何か非常に間違っているのですか?私はこのアップデート戦略で何か非常に間違っている人だと信じていますが、私はそれについては分かりません。その場合、私のアプローチには何が間違っていますか? **編集** : `_context.Update(entity)`と`_context.SaveChanges()`後だけを使用するように`Update`メソッドを更新しました。それでも、 `_context.Update(entity)`はこのメッセージとともに`InvalidOperationException`をスローします。 > 追加情報:エンティティー・タイプ 'User'のインスタンスは、同じキーを持つこのタイプの別のインスタンスがすでにトラッキングされているため、トラッキングできません。新しいエンティティを追加するとき、ほとんどのキータイプに対して、キーが設定されていない場合(つまり、キープロパティにそのタイプのデフォルト値が割り当てられている場合)、一意の一時キー値が作成されます。新しいエンティティのキー値を明示的に設定する場合は、既存のエンティティや他の新しいエンティティ用に生成された一時的な値と衝突しないようにしてください。既存のエンティティをアタッチする場合は、指定されたキー値を持つエンティティインスタンスが1つだけコンテキストにアタッチされていることを確認します。 > >
回答: すべての情報は例外メッセージに含まれています...既にその主キーが添付されているエンティティの別のコピーがあります。 私は次のいずれかをお勧めします(最初の方が優先されます): 1. 各アクションに新しいコンテキストを使用し、長期にわたるリポジトリ/コンテキストを持たない 2. 既存のエンティティを取得するには、主キーを使用してコンテキスト内で`.Set.Find(object[] key)`を使用します。 3. 現在の更新メソッドで`Set.Local.Find(..)`を使用して、既に存在するかどうかを確認します