public async Task can_re_run_the_tombstone_stream(TestCase @case)
        {
            @case.Store.Advanced.Clean.CompletelyRemoveAll();
            @case.Store.Tenancy.Default.EnsureStorageExists(typeof(IEvent));

            var operation = new EstablishTombstoneStream(@case.Store.Events);

            using var session = @case.Store.LightweightSession();

            var batch = new UpdateBatch(new [] { operation });
            await batch.ApplyChangesAsync((IMartenSession)session, CancellationToken.None);

            await batch.ApplyChangesAsync((IMartenSession)session, CancellationToken.None);

            if (@case.Store.Events.StreamIdentity == StreamIdentity.AsGuid)
            {
                (await session.Events.FetchStreamStateAsync(EstablishTombstoneStream.StreamId)).ShouldNotBeNull();
            }
            else
            {
                (await session.Events.FetchStreamStateAsync(EstablishTombstoneStream.StreamKey)).ShouldNotBeNull();
            }
        }
        public async Task SaveChangesAsync(CancellationToken token = default)
        {
            assertNotDisposed();

            processChangeTrackers();
            if (!_unitOfWork.HasOutstandingWork())
            {
                return;
            }

            await Database.BeginTransactionAsync(token).ConfigureAwait(false);

            await applyProjectionsAsync(token).ConfigureAwait(false);

            _unitOfWork.Sort(Options);

            foreach (var listener in Listeners)
            {
                await listener.BeforeSaveChangesAsync(this, token).ConfigureAwait(false);
            }

            var batch = new UpdateBatch(_unitOfWork.AllOperations);

            try
            {
                await batch.ApplyChangesAsync(this, token).ConfigureAwait(false);

                await Database.CommitAsync(token).ConfigureAwait(false);
            }
            catch (Exception)
            {
                await Database.RollbackAsync(token).ConfigureAwait(false);

                throw;
            }

            resetDirtyChecking(_unitOfWork);

            EjectPatchedTypes(_unitOfWork);
            Logger.RecordSavedChanges(this, _unitOfWork);

            foreach (var listener in Listeners)
            {
                await listener.AfterCommitAsync(this, _unitOfWork, token).ConfigureAwait(false);
            }

            // Need to clear the unit of work here
            _unitOfWork = new UnitOfWork(this);
        }