これにはたくさんの情報がありますが、何時間も読んだ後でも、思い通りに動作させることができないようです。
User オブジェクトを渡し、データベースから取り出した User オブジェクトへの変更を一般的に比較することで、User オブジェクトを更新しようとしています。このメソッドを使用すると、常に NotSupportedException が発生します。
別の DataContext から読み込まれた可能性がある、新しくないエンティティをアタッチまたは追加しようとしました。これはサポートされていません。
これが私がそれをやろうとしている方法です:
public void SaveUser(User User)
{
using (DataContext dataContext = new DataContext(WebConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
// New user
if (User.UserID == 0)
{
dataContext.Users.InsertOnSubmit(User);
}
// Existing user
else
{
User dbUser = dataContext.Users.Single(u => u.UserID.Equals(User.UserID));
Type t = dbUser.GetType();
foreach (PropertyInfo p in t.GetProperties())
{
if (p.CanWrite & p.GetValue(dbUser, null) != p.GetValue(User, null))
{
p.SetValue(dbUser, p.GetValue(User, null), null);
}
}
//dataContext.Refresh(RefreshMode.KeepCurrentValues, dbUser);
}
dataContext.SubmitChanges();
}
}
私が試したコメントアウトされた行もコメント解除しましたが、それは助けにはなりませんでした。
foreach() ループをコメントアウトして、dbUser.UserName = "Cheese"; のような行を追加するとします。データベース内のユーザー名を正常に更新します。これは、 foreach() ループが dbUser オブジェクトを変更してこれが失敗する原因であると私は信じています。
dbUser オブジェクトをデバッグすると、引数として渡された User オブジェクトからすべての変更が正しく取得されているように見えます。
オプティミスティック コンカレンシーについても調べて、タイムスタンプ データ型のテーブルに列を追加しましたが、効果もないようです。
ここで私は正確に何を間違っていますか?
何が変更されたかを一般的に検出し、データベースへの変更を正しく永続化するにはどうすればよいですか?