データベースから切断されたエンティティを Linq で更新するにはどうすればよいですか?
質問
以下のコードは正しく実行されず、スローされます InvalidOperationExcepiton
.
public void Foo()
{
DataContext context = new DataContext();
LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ;
context.LinqEntities.Attach(item, true);
}
解決
デフォルトでは、エンティティは編集時に同時実行性をチェックするためにすべてのフィールドを使用します。それが InvalidOperationException をスローしているものです。
これには、すべてのフィールドの「更新チェック」プロパティを「なし」に設定することができます。エンティティを変更済みとして添付するには、これをすべてのフィールドで実行する必要があります。これが完了すると、context.SubmitChanges() への追加呼び出しによってデータが保存されます。
あるいは、元の値がわかっている場合は、アタッチしてから更新することもできますが、チェックされるすべての値が元の値と一致する必要があります。
LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"};
context.LinqEntities.Attach(item);
item.Name = "John";
item.Surname = "Doe";
context.SubmitChanges();
他のヒント
データベースから切断されたという意味がわかりません。
LinqEntities テーブルに新しい行を挿入しようとしているようですが、正しいですか?
そうであれば、あなたはこうしたいでしょう
context.LinqEntities.InsertOnSubmit(item);
context.Submit();
ID = 1 の行を更新しようとしている場合は、次のように実行します。
DataContext context = new DataContext();
LinqEntity item = (from le in context.LinqEntities
where le.ID == 1
select le).Single();
item.Name = "John";
item.Surname = "Doe";
context.Submit();
Linq 式をより簡潔なラムダに置き換えることもできます。
LinqEntity item = context.LinqEntities.Single(le => le.ID == 1);
DataContext が行う最も重要な機能は、ユーザーが行った変更を追跡することです。これにより、Submit メソッドを呼び出すと、変更した内容に対して Insert ステートメントが自動生成されます。
ORM を使用する場合は、通常、オブジェクトを更新する前にオブジェクトを選択します。
使用できます DataContext.ExecuteCommand(...)
選択をしたくない場合は、ORM をバイパスします。