Пользовательский аудит 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 для измененных записей

0 ответов

Другие вопросы по тегам