private Task OnAfterSaveChanges(ListAuditEntry auditEntries)
        {
            foreach (var auditEntry in auditEntries.AuditEntries)
            {
                // Get the final value of the temporary properties
                foreach (var prop in auditEntry.TemporaryProperties)
                {
                    if (prop.Metadata.IsPrimaryKey())
                    {
                        auditEntry.HeaderAudit.ItemAudits.Add(new ItemAudit
                        {
                            FieldName = prop.Metadata.Name,

                            NewValue = prop.CurrentValue.ToString()
                        });
                        auditEntry.PrimaryKeys.Add(prop.CurrentValue.ToString());
                    }
                    else
                    {
                        if (!string.IsNullOrWhiteSpace((prop.CurrentValue ?? "").ToString()))
                        {
                            auditEntry.HeaderAudit.ItemAudits.Add(new ItemAudit
                            {
                                FieldName = prop.Metadata.Name,
                                NewValue  = prop.CurrentValue.ToString()
                            });
                        }
                    }
                }
                string pk = string.Join('|', auditEntry.PrimaryKeys);
                auditEntry.HeaderAudit.ItemAudits = auditEntry.HeaderAudit.ItemAudits.Select(c =>
                {
                    c.PrimaryKey = pk;
                    return(c);
                }).ToList();
                _headerAuditRepository.AddAsync(auditEntry.HeaderAudit);
            }
            return(Task.CompletedTask);
        }
        private ListAuditEntry OnBeforeSaveChanges()
        {
            _context.Instance.ChangeTracker.DetectChanges();
            var auditEntries = new ListAuditEntry();

            foreach (var entry in _context.Instance.ChangeTracker.Entries())
            {
                if (entry.Entity is IAudit || entry.State == EntityState.Detached || entry.State == EntityState.Unchanged)
                {
                    continue;
                }

                AuditEntry auditEntry = new AuditEntry();

                auditEntry.HeaderAudit.TableName = entry.Metadata.DisplayName();
                auditEntry.HeaderAudit.Date      = DateTime.Now;
                auditEntry.HeaderAudit.UserName  = "******";
                auditEntry.HeaderAudit.Operation = GetAuditOperation(entry.State);

                foreach (var property in entry.Properties)
                {
                    if (property.IsTemporary)
                    {
                        // value will be generated by the database, get the value after saving
                        auditEntry.TemporaryProperties.Add(property);
                        continue;
                    }

                    string propertyName = property.Metadata.Name;
                    if (property.Metadata.IsPrimaryKey())
                    {
                        auditEntry.HeaderAudit.ItemAudits.Add(new ItemAudit
                        {
                            FieldName = propertyName,
                            NewValue  = property.CurrentValue.ToString(),
                        });
                        auditEntry.PrimaryKeys.Add(property.CurrentValue.ToString());
                        continue;
                    }

                    switch (entry.State)
                    {
                    case EntityState.Added:
                        auditEntry.HeaderAudit.ItemAudits.Add(new ItemAudit
                        {
                            FieldName = propertyName,
                            NewValue  = (property.CurrentValue ?? "").ToString(),
                        });
                        break;

                    case EntityState.Deleted:
                        auditEntry.HeaderAudit.ItemAudits.Add(new ItemAudit
                        {
                            FieldName = propertyName,
                            NewValue  = (property.CurrentValue ?? "").ToString(),
                        });
                        break;

                    case EntityState.Modified:
                        if ((property.IsModified) && !string.IsNullOrWhiteSpace((property.CurrentValue ?? "").ToString()))
                        {
                            auditEntry.HeaderAudit.ItemAudits.Add(new ItemAudit
                            {
                                FieldName = propertyName,
                                NewValue  = (property.CurrentValue ?? "").ToString(),
                            });
                        }
                        break;
                    }
                }
                auditEntries.AuditEntries.Add(auditEntry);
            }
            return(auditEntries);
        }