2009-01-13 5 views
2

EntitySet에 연결된 엔터티 컬렉션이있는 엔터티가 있습니다. 궁극적으로이 항목에 대한 몇 가지 변경 사항을보고하려고합니다. 이 작업을 수행하는 데 GetModifiedMembers() 메서드를 사용할 가능성이 높습니다. EntitySet의 각 엔터티에서 동일한 작업을 수행 할 수 있다고 추측합니다. 그러나 해당 EntitySet에 삭제가 있었는지 확인하는 방법을 모르겠습니다. .LINQ to SQL EntitySet에서 삭제를 확인하는 방법

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

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()); 
     } 
    } 

편집 :

는이 같은 뭔가가 필요 무엇이 당신이 원하는 경우 참조하십시오? Customer

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()); 
      } 
     } 
    } 

엔티티이며 EntitySet<Order>있다. 내가 이해하는 한, 고객 자체가 변경되었는지 여부 및 변경된 고객의 주문이있는 경우 알 수있는 사항.

+0

GetChangeSet() 사용에 대해 생각했지만, 삭제 된 엔티티 중 하나가 부모의 EntitySet 멤버인지 어떻게 알 수 있습니까? –

+0

답변 수정 ... –

+0

시도했지만 작동하지 않습니다. 나는 자식 엔티티를로드하는 방법과 관련이있을 것이라고 생각합니다. 나는 문제가 내 편이라고 생각하기 때문에 올바른 대답으로 표시하고 있습니다. –

0

CodeSmith의 PLINQO는 SubmitChanges가 실행될 때 수행 된 모든 변경 사항을 캡처하고 LastAudit 컨텍스트 컨텍스트에서 액세스 할 수있는 Audit 객체에 모든 패키지를 패키징합니다. 변경된 내용과 그 업데이트의 유형을보고합니다. 샘플이 있습니다. http://plinqo.com/home.ashx?NoRedirect=1#Auditing_18