C# DbContext未检测到修改的自定义审核EF6.2

C# DbContext未检测到修改的自定义审核EF6.2,c#,entity-framework-6,audit-trail,C#,Entity Framework 6,Audit Trail,我已经扩展了DbContext以启用审核,当我进行修改时,我会遇到一个问题,因为我正在使用collection对象来跟踪没有修改的报告,而且,对于新记录,我没有获得主键: public partial class FinanceConnection { public int SaveChanges(int userId) { RecordAudit(userId); // AddTimestamps(userId); return

我已经扩展了DbContext以启用审核,当我进行修改时,我会遇到一个问题,因为我正在使用collection对象来跟踪没有修改的报告,而且,对于新记录,我没有获得主键:

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};");
    }

}
公共部分类财务连接
{
公共int SaveChanges(int userId)
{
记录审核(userId);
//AddTimestamps(userId);
返回base.SaveChanges();
}
公共任务saveChangesSync(int userId)
{
记录审核(userId);
//AddTimestamps(userId);
返回base.saveChangesSync();
}
私有void记录审核(int userId)
{
尝试
{
var listLogs=GetLogEntries(((IObjectContextAdapter)this).ObjectContext.ObjectStateManager,userId);
foreach(listLogs中的var日志)
{
var auditLog=新审核日志
{
ID=log.ID,
审核类型\u ID=log.Action,
TABLE_NAME=log.TableName,
COLUMN\u NAME=log.ColumnName,
记录\u PK=log.PrimaryKey,
旧值=log.OldValue,
NEW_VALUE=log.NewValue,
记录\u戳记=日志日期,
USER\u ID=log.UserId
};
审核日志。添加(审核日志);
}
}
捕获(例外e)
{
控制台写入线(e);
}
}
私有IEnumerable GetLogEntries(ObjectStateManager实体,int userId)
{
var listLogs=新列表();
var entries=entities.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted);
var modifiedEntities=this.ChangeTracker.Entries()。其中(p=>p.State==EntityState.Added | | p.State==EntityState.Modified | | p.State==EntityState.Deleted)。ToList();
foreach(分录中的var分录)
{
var tableName=entry.Entity.GetType().Name;
var pk=GetPrimaryKeys(条目);
开关(进入状态)
{
案例实体状态。添加:
{
...
打破
}
案例实体状态。已修改:
{
...
打破
}
案例实体状态。已删除:
{
...
打破
}
}
}
返回列表日志;
}
私有静态字符串GetPrimaryKeys(ObjectStateEntry条目)
{
var pk=string.Empty;
如果(entry.EntityKey==null | | entry.EntityKey.EntityKeyValues==null | | | entry.EntityKey.EntityKeyValues.Length==0)返回“不适用”;
返回entry.EntityKey.EntityKeyValues.Aggregate(pk,(current,keyValue)=>current+$“{keyValue.Key}={keyValue.Value};”;
}
}
问题: -我无法获取新记录的主键。新的记录案例有效。 -我无法获取修改的大小写,因为
实体。GetObjectStateEntries(EntityState.Added | EntityState.modified | EntityState.Deleted)
为修改的记录返回0