7

C# を介して asp.net 4 を使用します。

私のデータ アクセス層には、レコードを保存および更新するためのメソッドがあります。保存は簡単ですが、更新は面倒です。

以前は SubSonic を使用していましたが、これはアクティブなレコードがあり、レコードをロードし、いくつかのエントリを変更してから再度保存すると、それが更新として認識され、DB に新しいエントリを保存しようとしないことを知っていました。 .

LINQ で同じことを行う方法がわかりません。その結果、私のワークフローは次のようになります。

  1. Web ページは DB から「レコード A」を取得します
  2. その中のいくつかの値は、ユーザーによって変更されます。
  3. 「レコード A」はデータ アクセス層に戻されます
  4. ここで、Record A を再度ロードして「SavedRecord A」と呼び、渡された「Record A」の値でこのオブジェクトのすべての値を更新してから、「SavedRecord A」を更新/保存する必要があります。

「レコード A」を保存すると、DB に新しいエントリが作成されます。

明らかに、レコード A を渡して次のようなことを行う方がよいでしょう。

RecordA.Update();

ここに欠けているものがあると思いますが、オンラインで簡単な答えを見つけることができません。

4

3 に答える 3

2

インスタンスのAttachメソッドを使用して目的を達成し、.TableSubmitChanges()DataContext

このプロセスは私たちが望むほど簡単ではないかもしれませんが、David DeWinter のLINQ to SQL: Updating Entitiesを読んで、より詳細な説明/チュートリアルを確認してください。

于 2012-07-02T15:13:34.013 に答える
2

製品クラス OR DB があるとします。これを行う必要があります。

    DbContext _db = new DbContext();

    var _product = ( from p in _db.Products
                                    where p.Id == 1  // suppose you getting the first product
                                    select p).First();  // this will fetch the first record.

     _product.ProductName = "New Product";

     _db.SaveChanges();

      // this is for EF LINQ to Objects
     _db.Entry(_product).State = EntityState.Modified;  
     _db.SaveChanges();

-------------------------------------------------------------------------------------
this is another example using Attach
-------------------------------------------------------------------------------------

public static void Update(IEnumerable<Sample> samples , DataClassesDataContext db)
{
    db.Samples.AttachAll(samples);
    db.Refresh(RefreshMode.KeepCurrentValues, samples)
    db.SubmitChanges();
}

エンティティをコンテキストにアタッチしてから (KeepCurrentValues を選択して) 更新すると、Linq to SQL はサーバーからエンティティを取得して比較し、異なるエンティティを更新済みとしてマークします。

于 2012-07-02T15:23:26.670 に答える
1

LINQ-to-SQL がデータベース内のレコードを更新する場合、変更されたフィールドのみを更新するために、どのフィールドが変更されたかを正確に知る必要があります。基本的に次の 3 つのオプションがあります。

  • 更新されたデータが Web サーバーにポストバックされたら、データベースから既存のデータを読み込み、読み込まれたオブジェクトにすべてのプロパティを割り当てて、 を呼び出しますSubmitChanges()。既存の値が割り当てられているプロパティは更新されません。
  • オブジェクトの変更されていない状態を追跡し、Attach変更されていない値と変更された値の両方で使用します。
  • オプティミスティック コンカレンシー チェックに必要なすべての状態で新しいオブジェクトを初期化します (有効になっている場合、既定では有効になっています)。次に、オブジェクトをアタッチし、最後にアタッチに変更されたプロパティを更新して、DataContext 変更トラッカーが更新されたプロパティを認識できるようにします。

私は通常、最も簡単な最初のオプションを使用します。2 つの DB 呼び出しでパフォーマンスが低下しますが、多くの更新を行わない限り問題にはなりません。

于 2012-07-02T15:32:29.287 に答える