6

以下のコードは正しく実行されず、 がスローされInvalidOperationExcepitonます。

public void Foo()
{
 DataContext context = new DataContext();
 LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ;
 context.LinqEntities.Attach(item, true);
}
4

4 に答える 4

4

デフォルトでは、エンティティは編集時に同時実行性をチェックするためにすべてのフィールドを使用します。それが 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();
于 2008-09-02T18:26:10.403 に答える
1

データベースから切断されたという意味がわかりません。

LinqEntities テーブルに新しい行を挿入しようとしているようですが、正しいですか?

そうなったらやりたい

context.LinqEntities.InsertOnSubmit(item);
context.Submit();
于 2008-09-02T17:21:25.177 に答える
1

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 ステートメントが自動生成されます。

于 2008-09-02T17:32:18.113 に答える
0

ORM を使用する場合、通常、更新する前にオブジェクトを選択します。

DataContext.ExecuteCommand(...)選択を行いたくない場合は、ORM をバイパスするために使用できます。

于 2008-09-03T00:07:56.463 に答える