Пример #1
0
        public InterceptionResult <int> SavingChanges(
            DbContextEventData eventData,
            InterceptionResult <int> result)
        {
            _audit = CreateAudit(eventData.Context);

            using (var auditContext = new AuditContext(_connectionString))
            {
                auditContext.Add(_audit);
                auditContext.SaveChanges();
            }

            return(result);
        }
Пример #2
0
        public async ValueTask <InterceptionResult <int> > SavingChangesAsync(
            DbContextEventData eventData,
            InterceptionResult <int> result,
            CancellationToken cancellationToken = default)
        {
            _audit = CreateAudit(eventData.Context);

            using (var auditContext = new AuditContext(_connectionString))
            {
                auditContext.Add(_audit);
                await auditContext.SaveChangesAsync();
            }

            return(result);
        }
Пример #3
0
        private static SaveChangesAudit CreateAudit(DbContext context)
        {
            context.ChangeTracker.DetectChanges();

            var audit = new SaveChangesAudit {
                AuditId = Guid.NewGuid(), StartTime = DateTime.UtcNow
            };

            foreach (var entry in context.ChangeTracker.Entries())
            {
                var auditMessage = entry.State switch
                {
                    EntityState.Deleted => CreateDeletedMessage(entry),
                    EntityState.Modified => CreateModifiedMessage(entry),
                    EntityState.Added => CreateAddedMessage(entry),
                    _ => null
                };

                if (auditMessage != null)
                {
                    audit.Entities.Add(new EntityAudit {
                        State = entry.State, AuditMessage = auditMessage
                    });
                }
            }

            return(audit);

            string CreateAddedMessage(EntityEntry entry)
            => entry.Properties.Aggregate(
                $"Inserting {entry.Metadata.DisplayName()} with ",
                (auditString, property) => auditString + $"{property.Metadata.Name}: '{property.CurrentValue}' ");

            string CreateModifiedMessage(EntityEntry entry)
            => entry.Properties.Where(property => property.IsModified || property.Metadata.IsPrimaryKey())
            .Aggregate(
                $"Updating {entry.Metadata.DisplayName()} with ",
                (auditString, property) =>
                auditString + $"{property.Metadata.Name}: '{property.CurrentValue}' ");

            string CreateDeletedMessage(EntityEntry entry)
            => entry.Properties.Where(property => property.Metadata.IsPrimaryKey()).Aggregate(
                $"Deleting {entry.Metadata.DisplayName()} with ",
                (auditString, property) => auditString + $"{property.Metadata.Name}: '{property.CurrentValue}' ");
        }
    }