diff --git a/src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests.csproj b/src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests.csproj index 1169345d7..7cbd02559 100644 --- a/src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests.csproj +++ b/src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/When_using_transactional_session_with_transactionscope.cs b/src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/When_using_transactional_session_with_transactionscope.cs new file mode 100644 index 000000000..e4d987f98 --- /dev/null +++ b/src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/When_using_transactional_session_with_transactionscope.cs @@ -0,0 +1,124 @@ +namespace NServiceBus.TransactionalSession.AcceptanceTests +{ + using System; + using System.Data.SqlClient; + using System.Threading; + using System.Threading.Tasks; + using System.Transactions; + using AcceptanceTesting; + using Infrastructure; + using NUnit.Framework; + using ObjectBuilder; + + public class When_using_transactional_session_with_transactionscope : NServiceBusAcceptanceTest + { + [Test] + public async Task Should_provide_ambient_transactionscope() + { + string rowId = Guid.NewGuid().ToString(); + + await Scenario.Define() + .WithEndpoint(s => s.When(async (_, ctx) => + { + using var scope = ctx.Builder.CreateChildBuilder(); + using var transactionalSession = scope.Build(); + await transactionalSession.Open(); + + await transactionalSession.SendLocal(new SampleMessage()); + + var storageSession = transactionalSession.SynchronizedStorageSession.Session(); + + string insertText = + $@"IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='SomeTable' and xtype='U') + BEGIN + CREATE TABLE [dbo].[SomeTable]([Id] [nvarchar](50) NOT NULL) + END; + INSERT INTO [dbo].[SomeTable] VALUES ('{rowId}')"; + + await storageSession.CreateSQLQuery(insertText).ExecuteUpdateAsync(CancellationToken.None); + + using (var __ = new TransactionScope(TransactionScopeOption.Suppress, + TransactionScopeAsyncFlowOption.Enabled)) + { + using var connection = new SqlConnection(TransactionSessionDefaultServer.ConnectionString); + + await connection.OpenAsync(); + + using var queryCommand = + new SqlCommand( + $"SELECT TOP 1 [Id] FROM [dbo].[SomeTable] WITH (READPAST) WHERE [Id]='{rowId}' ", + connection); + object result = await queryCommand.ExecuteScalarAsync(); + + Assert.AreEqual(null, result); + } + + await transactionalSession.Commit().ConfigureAwait(false); + })) + .Done(c => c.MessageReceived) + .Run(); + + using var connection = new SqlConnection(TransactionSessionDefaultServer.ConnectionString); + + await connection.OpenAsync(); + + using var queryCommand = + new SqlCommand($"SELECT TOP 1 [Id] FROM [dbo].[SomeTable] WHERE [Id]='{rowId}'", connection); + object result = await queryCommand.ExecuteScalarAsync(); + + Assert.AreEqual(rowId, result); + } + + class Context : ScenarioContext, IInjectBuilder + { + public bool MessageReceived { get; set; } + public bool CompleteMessageReceived { get; set; } + public IBuilder Builder { get; set; } + } + + class AnEndpoint : EndpointConfigurationBuilder + { + public AnEndpoint() => + EndpointSetup(c => + { + c.EnableOutbox().UseTransactionScope(); + }); + + class SampleHandler : IHandleMessages + { + public SampleHandler(Context testContext) => this.testContext = testContext; + + public Task Handle(SampleMessage message, IMessageHandlerContext context) + { + testContext.MessageReceived = true; + + return Task.CompletedTask; + } + + readonly Context testContext; + } + + class CompleteTestMessageHandler : IHandleMessages + { + public CompleteTestMessageHandler(Context context) => testContext = context; + + public Task Handle(CompleteTestMessage message, IMessageHandlerContext context) + { + testContext.CompleteMessageReceived = true; + + return Task.CompletedTask; + } + + readonly Context testContext; + } + } + + class SampleMessage : ICommand + { + } + + class CompleteTestMessage : ICommand + { + } + } +} \ No newline at end of file diff --git a/src/NServiceBus.NHibernate.TransactionalSession.Tests/NServiceBus.NHibernate.TransactionalSession.Tests.csproj b/src/NServiceBus.NHibernate.TransactionalSession.Tests/NServiceBus.NHibernate.TransactionalSession.Tests.csproj index cbba0a799..548a14638 100644 --- a/src/NServiceBus.NHibernate.TransactionalSession.Tests/NServiceBus.NHibernate.TransactionalSession.Tests.csproj +++ b/src/NServiceBus.NHibernate.TransactionalSession.Tests/NServiceBus.NHibernate.TransactionalSession.Tests.csproj @@ -19,7 +19,7 @@ - + diff --git a/src/NServiceBus.NHibernate.TransactionalSession/NServiceBus.NHibernate.TransactionalSession.csproj b/src/NServiceBus.NHibernate.TransactionalSession/NServiceBus.NHibernate.TransactionalSession.csproj index 75e9f0ba2..8c5e60547 100644 --- a/src/NServiceBus.NHibernate.TransactionalSession/NServiceBus.NHibernate.TransactionalSession.csproj +++ b/src/NServiceBus.NHibernate.TransactionalSession/NServiceBus.NHibernate.TransactionalSession.csproj @@ -1,4 +1,4 @@ - + net461;netstandard2.0 @@ -10,8 +10,8 @@ - - + +