2009-01-13 44 views
2

我有一個實體在EntitySet中具有關聯實體的集合。最終,我試圖報告對此實體進行的一些更改。我很可能會使用GetModifiedMembers()方法來做到這一點,我猜我可以對EntitySet中的每個實體做同樣的事情,但我不知道如何判斷該EntitySet中是否有任何刪除。如何檢查LINQ to SQL實體集上的刪除

這樣做的最好方法是什麼?

回答

4

您可以使用dataContext.GetChangeSet()來跟蹤所有更改的實體並過濾特定的T實體。請看看這是你想要什麼:

public static void ShowModifiedEntitiesInfo<T>(DataContext context) where T : class 
    { 
     foreach (var entity in context.GetChangeSet().Updates.Where(del => del is T).Cast<T>()) 
     { 
      ModifiedMemberInfo[] modifiedMembers = context.GetTable<T>().GetModifiedMembers(entity); 
      Console.WriteLine("Updated Entity: " + entity.ToString()); 
      Console.WriteLine("  (Members Changed)"); 
      foreach (var member in modifiedMembers) 
      { 
       Console.WriteLine("  - Member Name: " + member.Member.Name); 
       Console.WriteLine("  - Original Value: " + member.OriginalValue.ToString()); 
       Console.WriteLine("  - Current Value: " + member.CurrentValue.ToString()); 
      } 
     } 
     foreach (var entity in context.GetChangeSet().Inserts.Where(del => del is T).Cast<T>()) 
     { 
      Console.WriteLine("Inserted Entity: " + entity.ToString()); 
     } 
     foreach (var entity in context.GetChangeSet().Deletes.Where(del => del is T).Cast<T>()) 
     { 
      Console.WriteLine("Deleted Entity: " + entity.ToString()); 
     } 
    } 

編輯:

是你所需要的是這樣的?

public static void ShowModifiedCustomerInfo(MyDataContext context, Customer customer) 
    { 
     ModifiedMemberInfo[] modifiedMembers = context.Customers.GetModifiedMembers(customer); 

     List<Order> updatedOrders = context.GetChangeSet().Updates.Where(e => e is Order).Cast<Order>().Intersect<Order>(customer.Orders).ToList<Order>(); 

     List<Order> insertedOrders = context.GetChangeSet().Inserts.Where(e => e is Order).Cast<Order>().Intersect<Order>(customer.Orders).ToList<Order>(); 

     List<Order> deletedOrders = context.GetChangeSet().Deletes.Where(e => e is Order).Cast<Order>().Intersect<Order>(customer.Orders).ToList<Order>(); 

     if (modifiedMembers.Length > 0 || updatedOrders.Count > 0 || insertedOrders.Count > 0 || deletedOrders.Count > 0) 
     { 
      Console.WriteLine("Updated Customer: " + customer.ToString()); 

      foreach (var member in modifiedMembers) 
      { 
       Console.WriteLine("  - Member Name: " + member.Member.Name); 
       Console.WriteLine("  - Original Value: " + member.OriginalValue.ToString()); 
       Console.WriteLine("  - Current Value: " + member.CurrentValue.ToString()); 
      } 

      foreach (var entity in updatedOrders) 
      { 
       Console.WriteLine("  Updated Order: " + entity.ToString()); 
      } 

      foreach (var entity in insertedOrders) 
      { 
       Console.WriteLine("  Inserted Order: " + entity.ToString()); 
      } 

      foreach (var entity in deletedOrders) 
      { 
       Console.WriteLine("  Deleted Order: " + entity.ToString()); 
      } 
     } 
    } 

Customer是實體和具有EntitySet<Order>。據我所知,你應該知道客戶本身是否發生了變化,以及是否有客戶的任何訂單也發生了變化。

+0

我想過使用GetChangeSet(),但我怎麼知道如果其中一個被刪除的實體是父母的EntitySet的成員? – 2009-01-13 17:15:11

0

CodeSmith的PLINQO捕獲執行SubmitChanges時所做的所有更改,並將其全部打包在可從上下文LastAudit屬性訪問的Audit對象中。報告更改的內容和更新的類型。有一個樣本在http://plinqo.com/home.ashx?NoRedirect=1#Auditing_18