private static AuditLog MadeAuditLog(DbContext context, EntityEntry entry, string currentUser) { var includedProperties = new List <string>(); var entityKey = entry.GetPrimaryKey(); var entityType = entry.Entity.GetType(); var auditLog = new AuditLog { Created = DateTimeOffset.Now, EntityFullName = entityType.FullName, Table = entry.Metadata.Relational().TableName, EntityJson = entry.Serialize(), EntityId = entityKey, Operation = entry.State == EntityState.Unchanged ? EntityState.Added.ToString() : entry.State.ToString(), User = currentUser }; if (entry.State == EntityState.Modified) { var props = entityType.GetProperties().Where(pi => !pi.IsAttr <NotAuditableAttribute>()); includedProperties.AddRange(props.Select(pi => pi.Name)); var propertiesChanged = (from prop in entry.Properties where (!Equals(prop.CurrentValue, prop.OriginalValue) && includedProperties.Contains(prop.Metadata.Name)) select new PropertyAudit { PropertyName = prop.Metadata.Name, NewValue = Convert.ToString(prop.CurrentValue), OldValue = Convert.ToString(prop.OriginalValue) }).ToArray(); auditLog.PropertiesAudits.AddRange(propertiesChanged); } return(auditLog); }
private static AuditEntry Audit(EntityEntry entry, AuditUser currentUser, Guid correlationId, DateTime dateCreated, bool addChangesetWhenInsert) { var includedProperties = new List <string>(); var entityKey = entry.GetPrimaryKey(); var entityType = entry.Entity.GetType(); var auditEntry = new AuditEntry { DateCreated = dateCreated, EntityName = entityType.FullName, #if NETSTANDARD2_0 TableName = entry.Metadata.Relational().TableName, #endif #if NETSTANDARD2_1 TableName = entry.Metadata.GetTableName(), #endif EntityData = entry.ToJson(), EntityKey = entityKey, OperationType = entry.State.ToOperationType(), UserId = currentUser.Id.ToString(), UserName = currentUser.Name, IPAddress = currentUser.IpAddress, CorrelationId = correlationId }; if (entry.State == EntityState.Modified || addChangesetWhenInsert) { var props = entityType.GetProperties().Where(prop => prop.GetCustomAttributes(typeof(AuditIgnorePropertyAttribute), false).Length == 0); includedProperties.AddRange(props.Select(pi => pi.Name)); var changeset = (from prop in entry.Properties where (((addChangesetWhenInsert && prop.CurrentValue != null) || !Equals(prop.CurrentValue, prop.OriginalValue)) && includedProperties.Contains(prop.Metadata.Name)) select new AuditEntryProperty { PropertyName = prop.Metadata.Name, NewValue = Convert.ToString(prop.CurrentValue), OldValue = addChangesetWhenInsert ? string.Empty : Convert.ToString(prop.OriginalValue) }).ToArray(); auditEntry.AuditEntryProperties.AddRange(changeset); } return(auditEntry); }