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); }