public int SaveChanges(Action<TrackingSaveChangeOptions> action)
 {
     TrackingSaveChangeOptions options = new TrackingSaveChangeOptions();
     action(options);
     TrackingContextFactory.Current.BeforeDbContextSaveChanges(this, options);
     var changes = base.SaveChanges();
     TrackingContextFactory.Current.AfterDbContextSaveChanges(this, CancellationToken.None, options);
     changes += base.SaveChanges();
     return changes;
 }
        public Task<int> SaveChangesAsync(CancellationToken cancellationToken, Action<TrackingSaveChangeOptions> action)
        {
            TrackingSaveChangeOptions options = new TrackingSaveChangeOptions();
            action(options);

            return Task.Factory.StartNew<int>(() =>
            {
                TrackingContextFactory.Current.BeforeDbContextSaveChanges(this, options);
                var result = base.SaveChangesAsync(cancellationToken).Result;
                TrackingContextFactory.Current.AfterDbContextSaveChanges(this, cancellationToken, options);
                base.SaveChangesAsync(cancellationToken).Wait();
                return result;
            }, cancellationToken);
        }