async Task AuditTemporaryProperties(IEnumerable <Tuple <EntityEntry, Audit> > temporaryEntities) { try { if (temporaryEntities != null && temporaryEntities.Any()) { await Audit.AddRangeAsync( temporaryEntities.ForEach(t => t.Item2.KeyValues = JsonConvert.SerializeObject(t.Item1.Properties.Where(p => p.Metadata.IsPrimaryKey()).ToDictionary(p => p.Metadata.Name, p => p.CurrentValue).NullIfEmpty())) .Select(t => t.Item2) ); await SaveChangesAsync(); } await Task.CompletedTask; } catch (Exception e) { //todo wrote log } }
async Task <IEnumerable <Tuple <EntityEntry, Audit> > > AuditNonTemporaryProperties() { try { ChangeTracker.DetectChanges(); var entitiesToTrack = ChangeTracker.Entries().Where(e => !(e.Entity is Audit) && e.State != EntityState.Detached && e.State != EntityState.Unchanged); AddTimestamps(entitiesToTrack); await Audit.AddRangeAsync( entitiesToTrack.Where(e => !e.Properties.Any(p => p.IsTemporary)).Select(e => new Audit() { DateCreated = DateTime.Now.ToUniversalTime(), TableName = e.Metadata.GetTableName(), Action = Enum.GetName(typeof(EntityState), e.State), DateTime = DateTime.Now.ToUniversalTime(), KeyValues = JsonConvert.SerializeObject(e.Properties.Where(p => p.Metadata.IsPrimaryKey()).ToDictionary(p => p.Metadata.Name, p => p.CurrentValue).NullIfEmpty()), NewValues = JsonConvert.SerializeObject(e.Properties.Where(p => e.State == EntityState.Added || e.State == EntityState.Modified).ToDictionary(p => p.Metadata.Name, p => p.CurrentValue).NullIfEmpty()), OldValues = JsonConvert.SerializeObject(e.Properties.Where(p => e.State == EntityState.Deleted || e.State == EntityState.Modified).ToDictionary(p => p.Metadata.Name, p => p.OriginalValue).NullIfEmpty()) }).ToList() ); //Return list of pairs of EntityEntry and ToolAudit return(entitiesToTrack.Where(e => e.Properties.Any(p => p.IsTemporary)) .Select(e => new Tuple <EntityEntry, Audit>( e, new Audit() { DateCreated = DateTime.Now.ToUniversalTime(), TableName = e.Metadata.GetTableName(), Action = Enum.GetName(typeof(EntityState), e.State), DateTime = DateTime.Now.ToUniversalTime(), NewValues = JsonConvert.SerializeObject(e.Properties.Where(p => !p.Metadata.IsPrimaryKey()).ToDictionary(p => p.Metadata.Name, p => p.CurrentValue).NullIfEmpty()) } )).ToList()); } catch (Exception e) { //todo:write log } return(null); }