ASP.NET CoreとEntity Framework Coreのチュートリアルに従っていました。 Microsoft SQL Serverデータベースに接続して行を取得および追加できますが、更新できません。私のupdateメソッドは新しいユーザーをアタッチし、状態を変更済みに設定します。
エラーが発生するたびに:
System.InvalidOperationException: 'エンティティタイプ' UserData 'のプロパティ' Id 'は、エンティティの状態を' Modified 'に変更しようとしたときに一時的な値を持っています。永続的な値を明示的に設定するか、データベースがこのプロパティの値を生成するように構成されていることを確認してください。
主キープロパティをデータベース生成に設定してみましたが、データベースに実装するために最善を尽くしましたが、それが機能しているかどうかはわかりません。また、FromSQLメソッドを使用してSQL更新を実行しようとしましたが、何も変更されませんでした(削除しようとしたときに、同様のおそらく別の問題が発生しました)。
以下は、dbコンテキスト実装からのupdateメソッドです。
public UserData Update(UserData updatedUser)
{
var entity = db.Users.Attach(updatedUser);
entity.State = EntityState.Modified;
//db.Users.FromSql<UserData>($"UPDATE Users SET user_name={updatedUser.user_name}, first_name={updatedUser.first_name}, last_name={updatedUser.last_name}, age={updatedUser.age}, email={updatedUser.email} WHERE");
return updatedUser;
}
このメソッドの直後に呼び出される別のメソッドで変更を保存します。
これが私のデータモデルです:
public class UserData
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int64 Id { get; set; }
public string user_name { get; set; }
public string first_name { get; set; }
public string last_name { get; set; }
public int age { get; set; }
public string email { get; set; }
}
基本的に、ユーザーを新しい情報で更新したいだけで、アタッチとエンティティを使用しようとしています。私がフォローしているチュートリアルで使用されている方法を変更しますが、より良い方法がある場合は、それも受け入れます。
[〜#〜] edit [〜#〜]:解決策は、回答としてマークしたコメントにあります。 .cshtmlページでは、ユーザーのIDを入力フィールドにバインドしていなかったため、デフォルトで「0」に設定されていました。
一意のインデックスがある場合も同じ例外が発生し、一意のインデックスでAddRangeが失敗し、catch例外ブロック内で挿入された全体を削除しようとしました。 (私のコードではありませんが、修正する必要がありました:-))
コードサンプル(簡略化):
try {
context.AddRange(users); // List<User>, has property List<Contact>
context.SaveChanges(); // throws exception on unique index
} catch (Exception ex) {
context.RemoveRange(users); // this throws exception "The property 'UserID' on entity type 'Contact' has a temporary value"
throw;
}
この「エンティティフレームワークコアの変更中の一時的な値のエラー」は、IDがUpdateメソッドに到達しない場合に発生します。
コードに問題はありません。ここでアタッチしていないビューに問題がありますが、「ビュー」で次のことを確認してください。