Пользовательский аудит EF6.2 с DbContext не обнаруживает изменений
Я расширил DbContext, чтобы включить аудит, и у меня возникает проблема, когда у меня есть изменения из-за объекта коллекции, который я использую для отслеживания отчетов без изменений, а также, для новой записи, я не получаю первичный ключ:
public partial class FinanceConnection
{
public int SaveChanges(int userId)
{
RecordAudit(userId);
// AddTimestamps(userId);
return base.SaveChanges();
}
public Task<int> SaveChangesAsync(int userId)
{
RecordAudit(userId);
// AddTimestamps(userId);
return base.SaveChangesAsync();
}
private void RecordAudit(int userId)
{
try
{
var listLogs = GetLogEntries(((IObjectContextAdapter)this).ObjectContext.ObjectStateManager, userId);
foreach (var log in listLogs)
{
var auditLog = new AUDIT_LOG
{
ID = log.Id,
AUDIT_TYPE_ID = log.Action,
TABLE_NAME = log.TableName,
COLUMN_NAME = log.ColumnName,
RECORD_PK = log.PrimaryKey,
OLD_VALUE = log.OldValue,
NEW_VALUE = log.NewValue,
RECORD_STAMP = log.Date,
USER_ID = log.UserId
};
AUDIT_LOGS.Add(auditLog);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
private IEnumerable<CustomLog> GetLogEntries(ObjectStateManager entities, int userId)
{
var listLogs = new List<CustomLog>();
var entries = entities.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted);
var modifiedEntities = this.ChangeTracker.Entries().Where(p => p.State == EntityState.Added || p.State == EntityState.Modified || p.State == EntityState.Deleted).ToList();
foreach (var entry in entries)
{
var tableName = entry.Entity.GetType().Name;
var pk = GetPrimaryKeys(entry);
switch (entry.State)
{
case EntityState.Added:
{
...
break;
}
case EntityState.Modified:
{
...
break;
}
case EntityState.Deleted:
{
...
break;
}
}
}
return listLogs;
}
private static string GetPrimaryKeys(ObjectStateEntry entry)
{
var pk = string.Empty;
if (entry.EntityKey == null || entry.EntityKey.EntityKeyValues == null || entry.EntityKey.EntityKeyValues.Length == 0) return "N/A";
return entry.EntityKey.EntityKeyValues.Aggregate(pk, (current, keyValue) => current + $"{keyValue.Key}={keyValue.Value};");
}
}
Проблемы:
- Я не могу получить первичный ключ для новой записи. Новый рекорд дело работает.
- Я не могу получить измененный случай как entities.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted)
возвращает 0 для измененных записей