2017-03-21 12 views
5

I m ghi đè phương thức SaveChange(). Những gì tôi muốn là để ghi lại tất cả các thay đổi được thực hiện cho một thực thể vào cơ sở dữ liệu trong văn bản đơn giản như "abc updated Name john toee, ..." vn Tôi đã đạt được chức năng nhưng khi có khóa ngoài trong thực thể cập nhật như country_Id mà chỉ ra bảng Quốc gia nó tạo ra văn bản như "abc cập nhật Country_Id 1 đến 3, ..." thats những gì tôi không muốn nó nên được như thế này "abc cập nhật quốc gia Canada đến Úc, ..."Kiểm tra C# ghi đè phương thức SaveChanges(). Cách tìm khóa ngoài của một thực thể và giá trị của nó từ bảng

Vì vậy, để đạt được điều này cần biết các phím nước ngoài và giá trị của nó

Mã của tôi là:

public override int SaveChanges() 
    { 
     List<string> listChanges = new List<string>(); 
     List<string> listTable = new List<string>(); 

     var objectStateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager; 
     IEnumerable<ObjectStateEntry> changes = 
      objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added | EntityState.Deleted); 


     foreach (ObjectStateEntry stateEntryEntity in changes) 
     { 

      var modifiedProperties = stateEntryEntity.GetModifiedProperties(); 
      foreach (var propName in modifiedProperties) 
      { 
       if (Convert.ToString(stateEntryEntity.OriginalValues[propName]) != Convert.ToString(stateEntryEntity.CurrentValues[propName])) 
       { 
        listTable.Add(stateEntryEntity.EntityKey.EntitySetName); 
        listChanges.Add(propName + " From " + Convert.ToString(stateEntryEntity.OriginalValues[propName]) + " to " + Convert.ToString(stateEntryEntity.CurrentValues[propName])); 

       } 


       //System.Console.WriteLine("Property {0} changed from {1} to {2}", 
       //  propName, 
       //  stateEntryEntity.OriginalValues[propName], 
       //  stateEntryEntity.CurrentValues[propName]); 
      } 
     } 
     return base.SaveChanges(); 
    } 
+0

Có một dự án ở đây cho phép bạn thực hiện kiểm toán thay đổi do khuôn khổ tổ chức , giá trị mới và cũ vv Tôi tự hỏi nếu bất kỳ mã trong đó có thể giúp bạn đạt được điều này. https://github.com/bilal-fazlani/tracker-enabled-dbcontext Vấn đề bạn gặp phải là các mối quan hệ thường như thế này, một khóa ngoại, xác định một Id của toàn bộ hàng, vì vậy bạn không thể hiển thị ' Canada đến Úc 'mà không chỉ định tên cột cụ thể ... trừ khi bạn áp dụng một số loại quy ước. – Luke

Trả lời

0

các lại là một tính năng để đạt được điều này, tôi sử dụng changetracker để theo dõi những thay đổi và log.You nhận được mọi thay đổi ngay trước khi vứt bỏ bối cảnh của bạn vì vậy, trong một thời gian ngắn bạn có thể xây dựng như thế này;

public override int SaveChanges() 
     { 
      foreach (var history in ChangeTracker.Entries() 
       .Where(e => e.Entity is IModificationHistory && (e.State == EntityState.Added || 
                   e.State == EntityState.Modified)) 
       .Select(e => e.Entity as IModificationHistory) 
      ) 
      { 
       history.DateModified = DateTime.Now; 
       if (history.DateCreated == DateTime.MinValue) 
        history.DateCreated = DateTime.Now; 
      } 
      var result = base.SaveChanges(); 
      foreach (var history in ChangeTracker.Entries() 
       .Where(e => e.Entity is IModificationHistory) 
       .Select(e => e.Entity as IModificationHistory) 
      ) 
       history.IsDirty = false; 
      return result; 
     } 

Ngoài ra bạn có thể chỉ nhập của bạn ngay trước khi base.savechanges()

này được giao diện lịch sử của tôi

public interface IModificationHistory 
    { 
     DateTime DateModified { get; set; } 
     DateTime DateCreated { get; set; } 
     bool IsDirty { get; set; } 
    } 
Các vấn đề liên quan