Я использую 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;
Но я до сих пор не получить его, чтобы предоставить мне оригинал и текущее значение правильно. Любая помощь приветствуется.
Код, который вы отправили, не помогает отладить эту проблему. Проблема здесь, прежде чем вы получите 'dbEntry'. Он должен включать некоторую организацию, которая очень важна, чтобы знать, следует ли ее правильно отслеживать или нет. – Hopeless
Я обновил сообщение –