2015-09-23 3 views
0

Я использую Entity Framework 7, и мне нужно иметь возможность отслеживать изменения. Я в конечном счете, сделать что-то вроде этого в течение по SaveChanges я перекрывая его, то в конце с помощью base.SaveChanges():EntityFramework Change Tracking not tracking changes

foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == EntityState.Deleted || p.State == EntityState.Modified).ToList()) 
{ 
    // For each changed record, get the audit record entries and add them 
    foreach (TableChange x in GetTableChangeRecordsForChange(ent, _ChangeUser)) 
    { 
     this.TableChanges.Add(x); 
     val = true; 
    } 
} 

В конечном итоге это вызывает, чтобы получить записи изменений таблицы:

private IEnumerable<TableChange> GetTableChangeRecordsForChange(EntityEntry dbEntry, string userId) 
{ 
    List<TableChange> result = new List<TableChange>();  
    foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == EntityState.Deleted || p.State == EntityState.Modified).ToList()) 
    { 
     // For each changed record, get the audit record entries and add them 
     foreach (TableChange x in GetTableChangeRecordsForChange(ent, _ChangeUser)) 
     { 
      this.TableChanges.Add(x); 
      val = true; 
     } 
    } 

    if (dbEntry.State == EntityState.Modified) 
    { 
     foreach (var property in dbEntry.Entity.GetType().GetTypeInfo().DeclaredProperties) 
     { 

      // For updates, we only want to capture the columns that actually changed 
      if (!object.Equals(dbEntry.Property(property.Name).OriginalValue, dbEntry.Property(property.Name).CurrentValue)) 
      { 
       result.Add(new TableChange() 
       { 
         Action = "U", 
         ColumnName = property.Name, 
         CreatedBy = userId, 
         CreatedOn = DateTime.Now, 
         OldValue = dbEntry.Property(property.Name).OriginalValue.ToString(), 
         NewValue = dbEntry.Property(property.Name).CurrentValue.ToString(), 
         TableName = dbEntry.Entity.GetType().GetTypeInfo().Name, 
         TableID = dbEntry.Property("ID").CurrentValue.ToString() 
         }); 
       } 

      } 
    } 
} 

Теперь проблема, с которой я столкнулась, - это OriginalValue & CurrentValue и новое значение, которое было введено. Он не отслеживает исходное значение.

У меня есть:

this.ChangeTracker.AutoDetectChangesEnabled = true; 

Но я до сих пор не получить его, чтобы предоставить мне оригинал и текущее значение правильно. Любая помощь приветствуется.

+0

Код, который вы отправили, не помогает отладить эту проблему. Проблема здесь, прежде чем вы получите 'dbEntry'. Он должен включать некоторую организацию, которая очень важна, чтобы знать, следует ли ее правильно отслеживать или нет. – Hopeless

+0

Я обновил сообщение –

ответ

1

Итак, я понял свою проблему ... Проблема, с которой я столкнулся, заключалась в том, что я прикреплял запись, необходимую для обновления. Я в конечном счете обновил запись, создав мою функцию обновления:

public T ADMSUpdate<T>(T entity, T originalEntity) 
    { 
     object propertyValue = null; 
     PropertyInfo[] properties = originalEntity.GetType().GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      propertyValue = null; 
      if (null != property.GetSetMethod()) 
      { 
       PropertyInfo entityProperty = entity.GetType().GetProperty(property.Name); 
       propertyValue = entity.GetType().GetProperty(property.Name).GetValue(entity, null); 

       if (null != propertyValue) 
       { 
        property.SetValue(originalEntity, propertyValue, null); 
       } 
      } 
     } 
     return entity; 
    } 
+0

Не могли бы вы поделиться полным кодом рабочего решения? – Ssss