2010-07-16 29 views
35

Có cách nào để nhận tất cả các thay đổi được thực hiện cho một đối tượng trong Khuôn khổ thực thể trước khi lưu tất cả thay đổi. Lý do cho điều này là tôi muốn tạo ra một bảng đăng nhập cơ sở dữ liệu khách hàng của chúng tôi:Bắt tất cả các thay đổi được thực hiện cho một đối tượng trong Khung thực thể

như vậy ...

Có cách nào để có được những giá trị cơ sở dữ liệu hiện hành (cũ) và các giá trị mới (hiện tại) trước khi thay đổi được lưu?

Nếu không, làm thế nào tôi có thể đạt được điều này một cách chung chung, vì vậy tất cả Xem Models của tôi có thể kế thừa từ này? (Tôi đang sử dụng cấu trúc MVVM + M)

+0

Bạn có thể giải quyết điều đó bằng SP và Trình kích hoạt trong Cơ sở dữ liệu. –

Trả lời

44

Bạn có thể sử dụng ObjectContext của ObjectStateManager,GetObjectStateEntry để có được một đối tượng ObjectStateEntry, giữ giá trị ban đầu và hiện tại của nó trong các thuộc tính OriginalValuesCurrentValues. Bạn có thể lấy tên của các thuộc tính đã thay đổi bằng cách sử dụng phương thức GetModifiedProperties.

Bạn có thể viết một cái gì đó như:

var myObjectState=myContext.ObjectStateManager.GetObjectStateEntry(myObject); 
var modifiedProperties=myObjectState.GetModifiedProperties(); 
foreach(var propName in modifiedProperties) 
{ 
    Console.WriteLine("Property {0} changed from {1} to {2}", 
     propName, 
     myObjectState.OriginalValues[propName], 
     myObjectState.CurrentValues[propName]); 
} 
+1

Hãy xem bài viết này [Đường dẫn kiểm tra sử dụng EF ObjectContext] (http://www.codeproject.com/Articles/34491/Implementing-Audit-Trail-using-Entity-Framework-Pa) –

+0

Anh ấy đang sử dụng cùng một phương pháp cũng như –

+0

'ApplicationDbContext' không chứa định nghĩa cho 'ObjectStateManager' – Sam

20

Đối EF5 trở lên bạn có thể đăng nhập thay đổi của bạn trong SaveChanges() phương pháp như thế này:

public override int SaveChanges() 
    { 

     var changes = from e in this.ChangeTracker.Entries() 
         where e.State != System.Data.EntityState.Unchanged 
         select e; 

     foreach (var change in changes) 
     { 
      if (change.State == System.Data.EntityState.Added) 
      { 
       // Log Added 
      } 
      else if (change.State == System.Data.EntityState.Modified) 
      { 
       // Log Modified 
       var item = change.Cast<IEntity>().Entity; 
       var originalValues = this.Entry(item).OriginalValues; 
       var currentValues = this.Entry(item).CurrentValues; 

       foreach (string propertyName in originalValues.PropertyNames) 
       { 
        var original = originalValues[propertyName]; 
        var current = currentValues[propertyName]; 

        if (!Equals(original, current)) 
        { 
         // log propertyName: original --> current 
        } 
       } 

      } 
      else if (change.State == System.Data.EntityState.Deleted) 
      { 
       // log deleted 
      } 
     } 
     // don't forget to save 
     base.SaveChanges(); 
    } 
5

tôi sử dụng chức năng này mở rộng cung cấp chi tiết về thực thể được thay đổi, giá trị cũ và mới, kiểu dữ liệu và khóa thực thể.

Điều này được thử nghiệm với EF6.1 sử dụng ObjectContext và sử dụng log4net cho đầu ra.

/// <summary> 
    /// dump changes in the context to the debug log 
    /// <para>Debug logging must be turned on using log4net</para> 
    /// </summary> 
    /// <param name="context">The context to dump the changes for</param> 
    public static void DumpChanges(this ObjectContext context) 
    { 
     context.DetectChanges(); 
     // Output any added entries 
     foreach (var added in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) 
     { 
      Log.DebugFormat("{0}:{1} {2} {3}", added.State, added.Entity.GetType().FullName, added.Entity.ToString(), string.Join(",", added.CurrentValues.GetValue(1), added.CurrentValues.GetValue(2))); 
     } 
     foreach (var modified in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) 
     { 
      // Put original field values into dictionary 
      var originalValues = new Dictionary<string,int>(); 
      for (var i = 0; i < modified.OriginalValues.FieldCount; ++i) 
      { 
       originalValues.Add(modified.OriginalValues.GetName(i), i); 
      } 
      // Output each of the changed properties. 
      foreach (var entry in modified.GetModifiedProperties()) 
      { 
       var originalIdx = originalValues[entry]; 
       Log.DebugFormat("{6} = {0}.{4} [{7}][{2}] [{1}] --> [{3}] Rel:{5}", 
        modified.Entity.GetType(), 
        modified.OriginalValues.GetValue(originalIdx), 
        modified.OriginalValues.GetFieldType(originalIdx), 
        modified.CurrentValues.GetValue(originalIdx), 
        modified.OriginalValues.GetName(originalIdx), 
        modified.IsRelationship, 
        modified.State, 
        string.Join(",", modified.EntityKey.EntityKeyValues.Select(v => string.Join(" = ", v.Key, v.Value)))); 
      } 
     } 
     // Output any deleted entries 
     foreach (var deleted in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted)) 
     { 
      Log.DebugFormat("{1} {0} {2}", deleted.Entity.GetType().FullName, deleted.State, string.Join(",", deleted.CurrentValues.GetValue(1), deleted.CurrentValues.GetValue(2))); 
     } 
    } 
+0

Câu hỏi ban đầu là làm thế nào để có được những thay đổi đối với một thực thể không phải là những thay đổi được thực hiện cho ngữ cảnh. –

Các vấn đề liên quan