2010-11-20 11 views
1

HI、 Wit linq私はDALのジェネリックリストを作成します。 UIレイヤーで、ユーザーはリストからアイテムを削除して更新します。 LINQは、削除されたアイテムをチェックしたり、新しいアイテムを追加したり、他のアイテムを更新するなどのコードを書く必要がなく、変更を追跡することは可能ですか?リストをポップするdatacontextを使用するとこれは不可能と思われます。 SubmitChangesを担当する別のdatacontextどんな助けもありがたい。LINQトラックの変更

おかげ ニール

答えて

3

Linq.DataContextを使用している場合、実際には変更が記録されます。

参照する関数はSystem.Data.Linq.DataContext.GetChangeSetです。 GetChangeSetはいつでも呼び出すことができますが、MSDNのドキュメントのRemarksセクションを参照するとよいでしょう。

あなたが提出する上で行動を取る/確認することができます...ここで

あなたはDataContextSubmitChangesをオーバーライドし、その時点でのアクションを取ることができる方法の簡単な例です。

例が提出し、最終的な、あなたも追跡することができますし、特定のメンバーが更新されると、特別な行動を取る前に、あなたがデータを変更することができることを示しています

namespace ExampleProject1.Models 
{ 
    public partial class ExampleProject1DataContext 
    { 
     public override void SubmitChanges(ConflictMode failureMode) 
     { 
      ManangeAndProcessChangeSet(base.GetChangeSet()); 
      base.SubmitChanges(failureMode); 
     } 

     private void ManangeAndProcessChangeSet(ChangeSet changeSet) 
     { 
      DateTime now = DateTime.UtcNow; 

      if (changeSet.Inserts.Count > 0) 
      { 
       ProcessInserts(changeSet.Inserts, now); 
      } 

      if (changeSet.Updates.Count > 0) 
      { 
       ProcessUpdates(changeSet.Updates, now); 
      } 

      if (changeSet.Deletes.Count > 0) 
      { 
       ProcessDeletes(changeSet.Deletes, now); 
      } 
     } 

     private void ProcessInserts(IList<object> list, DateTime now) 
     { 
      IEnumerable<Cake> cakes = list.OfType<Cake>(); 
      IEnumerable<Topping> toppings = list.OfType<Topping>(); 

      // Update the created and modified times. 
      foreach (Cake cake in cakes) 
      { 
       cake.Guid = Guid.NewGuid(); 
       cake.CreatedDateTime = now; 
       cake.ModifiedDateTime = now; 
      } 
      foreach (Topping topping in toppings) 
      { 
       topping.Guid = Guid.NewGuid(); 
       topping.CreatedDateTime = now; 
       topping.ModifiedDateTime = now; 
      } 
     } 

     private void ProcessUpdates(IList<object> list, DateTime now) 
     { 
      IEnumerable<Cake> cakes = list.OfType<Cake>(); 
      IEnumerable<Topping> toppings = list.OfType<Topping>(); 

      // Update the created and modified times. 
      foreach (Cake cake in cakes) 
      { 
       ProcessUpdates(cake, now); 
      } 
      foreach (Topping topping in toppings) 
      { 
       topping.ModifiedDateTime = now; 
      } 
     } 

     private void ProcessDeletes(IList<object> list, DateTime now) 
     { 
      IEnumerable<Cake> cakes = list.OfType<Cake>(); 
      IEnumerable<Topping> toppings = list.OfType<Topping>(); 

      // Could create tasks here to delete associated stored files for cakes and toppings. 
     } 

     private bool ProcessUpdates(Cake cake, DateTime now) 
     { 
      bool modified = false; 

      ModifiedMemberInfo[] mmi = context.Cakes.GetModifiedMembers(cake); 
      foreach (ModifiedMemberInfo mi in mmi) 
      { 
       switch (mi.Member.Name) 
       { 
        case "CountOfItemsSold": 
         // Exclude from updating the modified date. 
         break; 

        case "IsExpired": 
         if ((bool)mi.CurrentValue) 
         { 
          cake.ExpiredDateTime = now; 
         } 
         else 
         { 
          cake.ExpiredDateTime = null; 
         } 
         modified = true; 
         break; 

        default: 
         modified = true; 
         break; 
       } 
      } 

      if (modified) 
      { 
       cake.ModifiedDateTime = now; 
      } 

      return modified; 
     } 

    } 
} 
+0

なぜケーキとトッピング?さて、どうしてですか? :-) –

0

あなたが使用しているが、複数のDataContextが関与している場合は、[はいどのような編集メカニズムは不明である:あなたが(DeleteOnSubmit経由)、削除について提出データ・コンテキストを伝える必要があります。もちろん、についてはすべてに変更する必要があります。変更しないと、データベースを変更することがわかりません。

+0

私は複数のDataContextを使用していますので、私はそれを指示する必要があります理想的ではない変化のデータコンテキスト。私はLINQが私のためにこれの後を見ていたが、あなたが助けてくれたことを不幸にもdosent.thanks好むだろう – Somedeveloper

1

Nティアアプリケーションをお持ちの場合は、更新、削除、挿入を切断した状態で行うため、これはできません。

つまり、リストを作成するために1つのデータコンテキストが使用され、エンティティはWCFまたはその他のメカニズムを介してクライアントに渡され、DALに送り返され、別のデータコンテキストが使用されます更新を行います。

関連する問題