private EntityChange CreateEntityChangeInfo(EntityEntry entityEntry)
        {
            var entity = entityEntry.Entity;

            EntityChangeType changeType;

            switch (entityEntry.State)
            {
            case EntityState.Added:
                changeType = EntityChangeType.Create;
                break;

            case EntityState.Deleted:
                changeType = EntityChangeType.Delete;
                break;

            case EntityState.Modified:
                changeType = IsDeleted(entityEntry) ? EntityChangeType.Delete : EntityChangeType.Change;
                break;

            case EntityState.Detached:
            case EntityState.Unchanged:
            default:
                return(null);
            }

            var entityId = GetEntityId(entity);

            if (entityId == null && changeType != EntityChangeType.Create)
            {
                return(null);
            }

            var entityType       = entity.GetType();
            var entityChangeInfo = new EntityChange
            {
                ChangeTime          = Clock.Now,
                ChangeType          = changeType,
                EntityEntry         = entityEntry, // [NotMapped]
                EntityId            = entityId,
                EntityTypeFullName  = entityType.FullName,
                EntityTypeName      = entityType.Name,
                EntityTypeTableName = entityEntry.Metadata.Relational().TableName,
                PropertyChanges     = GetPropertyChanges(entityEntry)
            };

            return(entityChangeInfo);
        }
        private DateTime GetChangeTime(EntityChange entityChange)
        {
            var entity = entityChange.EntityEntry.As <EntityEntry>().Entity;

            switch (entityChange.ChangeType)
            {
            case EntityChangeType.Create:
                return((entity as ICreatedDateAuditableEntity)?.AACreatedDate ?? Clock.Now);

            case EntityChangeType.Delete:
                return((entity as IUpdatedDateAuditableEntity)?.AAUpdatedDate ?? Clock.Now);

            case EntityChangeType.Change:
                return((entity as IUpdatedDateAuditableEntity)?.AAUpdatedDate ?? Clock.Now);

            default:
                return(Clock.Now);
            }
        }