Esempio n. 1
0
        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);
        }