示例#1
0
        public async Task It_should_rollback_both_entity_and_change_log_within_async_flow()
        {
            // Given
            var id        = Guid.NewGuid();
            var user      = new UserAggregate(id, "Bond");
            var changeLog = user.Changes.GetUncommittedChanges().ToList();

            using var db = NewDbContext();
            db.Users.Add(user);
            await db.SaveChangesAsync();

            // When
            using (var tran = TransactionExt.BeginAsync(IsolationLevel.ReadCommitted))
            {
                user.Rename("James Bond");
                await db.SaveChangesAsync();
            }

            // Then
            db.DetachAll();
            var savedUser = await db.Users.FindAsync(id);

            var savedChangeLog = await LoadChangeLog(user.StreamId);

            savedUser.Should().BeEquivalentTo(new UserAggregate(id, "Bond"));
            savedChangeLog.Should().HaveSameCount(changeLog);
            for (var i = 0; i < savedChangeLog.Count; i++)
            {
                savedChangeLog[i].Should().BeEquivalentTo((object)changeLog[i]);
                savedChangeLog[i].Should().BeOfType(changeLog[i].GetType());
            }
        }
示例#2
0
        protected async Task InsertUserInTransaction(UserAggregate user, Task beforeTransactionDone)
        {
            await Task.Yield();

            using var transaction = TransactionExt.BeginAsync(IsolationLevel.ReadCommitted);
            using var db          = NewDbContext();
            db.Users.Add(user);
            await db.SaveChangesAsync();

            await beforeTransactionDone;

            transaction.Complete();
        }