以下のコードは正しく実行されず、 がスローされ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 をバイパスするために使用できます。