diff --git a/src/AppForeach.Framework.EntityFrameworkCore/DbContextActivator.cs b/src/AppForeach.Framework.EntityFrameworkCore/DbContextActivator.cs index 89b058a..cb2b900 100644 --- a/src/AppForeach.Framework.EntityFrameworkCore/DbContextActivator.cs +++ b/src/AppForeach.Framework.EntityFrameworkCore/DbContextActivator.cs @@ -46,7 +46,7 @@ public TDbContext Activate(DbContextOperationEnlistmentStrategy oper db = (TDbContext)ActivatorUtilities.CreateInstance(serviceProvider, typeof(TDbContext), optionsBuilder.Options); - if (isCommand == false) + if (isCommand == false && operationEnlistmentStrategy != DbContextOperationEnlistmentStrategy.Suppress) { db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; db.SavingChanges += Db_SavingChanges; diff --git a/tests/AppForeach.Framework.EntityFrameworkCore.Tests/DbContextActivatorTests.cs b/tests/AppForeach.Framework.EntityFrameworkCore.Tests/DbContextActivatorTests.cs index 467dbd9..f1dfa0d 100644 --- a/tests/AppForeach.Framework.EntityFrameworkCore.Tests/DbContextActivatorTests.cs +++ b/tests/AppForeach.Framework.EntityFrameworkCore.Tests/DbContextActivatorTests.cs @@ -17,9 +17,9 @@ public class DbContextActivatorTests : IDisposable private TransactionScopeState? transactionScopeState; [Fact] - public async Task Activate_Should_CreateEnlistedDbContext_WhenDefaultStrategyAndTransactionOpened() + public async Task Activate_Should_CreateEnlistedDbContext_WhenDefaultStrategyAndCommand() { - await OpenTransaction(); + await OpenTransaction(isCommand: true); using var db = activator.Activate(); @@ -29,7 +29,7 @@ public async Task Activate_Should_CreateEnlistedDbContext_WhenDefaultStrategyAnd [Fact] public async Task Activate_Should_CreateIndependentDbContext_WhenDefaultStrategyAndQuery() { - SetQuery(); + await OpenTransaction(isCommand: false); using var db = activator.Activate(); @@ -37,9 +37,9 @@ public async Task Activate_Should_CreateIndependentDbContext_WhenDefaultStrategy } [Fact] - public async Task Activate_Should_CreateEnlistedDbContext_WhenRequiredStrategyAndTransactionOpened() + public async Task Activate_Should_CreateEnlistedDbContext_WhenRequiredStrategyAndCommand() { - await OpenTransaction(); + await OpenTransaction(isCommand: true); using var db = activator.Activate(DbContextOperationEnlistmentStrategy.Required); @@ -49,7 +49,7 @@ public async Task Activate_Should_CreateEnlistedDbContext_WhenRequiredStrategyAn [Fact] public async Task Activate_Should_CreateIndependentDbContext_WhenRequiredStrategyAndQuery() { - SetQuery(); + await OpenTransaction(isCommand: false); using var db = activator.Activate(DbContextOperationEnlistmentStrategy.Required); @@ -103,9 +103,9 @@ public async Task Activate_Should_Throw_WhenRequiredStrategyAndTransactionNotSet } [Fact] - public async Task Activate_Should_CreateEnlistedDbContext_WhenOptionalStrategyAndTransactionOpened() + public async Task Activate_Should_CreateEnlistedDbContext_WhenOptionalStrategyAndCommand() { - await OpenTransaction(); + await OpenTransaction(isCommand: true); using var db = activator.Activate(DbContextOperationEnlistmentStrategy.Optional); @@ -115,7 +115,7 @@ public async Task Activate_Should_CreateEnlistedDbContext_WhenOptionalStrategyAn [Fact] public async Task Activate_Should_CreateIndependentReadOnlyDbContext_WhenOptionalStrategyAndQuery() { - SetQuery(); + await OpenTransaction(isCommand: false); using var db = activator.Activate(DbContextOperationEnlistmentStrategy.Optional); @@ -139,13 +139,27 @@ public async Task Activate_Should_CreateIndependentModifiableDbContext_WhenOptio } [Fact] - public async Task Activate_Should_CreateIndependentDbContext_WhenSuppressStrategyAndTransaction() + public async Task Activate_Should_CreateIndependentModifiableDbContext_WhenSuppressStrategyAndCommand() { - await OpenTransaction(); + await OpenTransaction(isCommand: true); using var db = activator.Activate(DbContextOperationEnlistmentStrategy.Suppress); db.Database.CurrentTransaction.ShouldBeNull(); + + await db.SaveChangesAsync(); + } + + [Fact] + public async Task Activate_Should_CreateIndependentModifiableDbContext_WhenSuppressStrategyAndQuery() + { + await OpenTransaction(isCommand: false); + + using var db = activator.Activate(DbContextOperationEnlistmentStrategy.Suppress); + + db.Database.CurrentTransaction.ShouldBeNull(); + + await db.SaveChangesAsync(); } public DbContextActivatorTests() @@ -201,7 +215,7 @@ public DbContextActivatorTests() activator = new DbContextActivator(operationContextMock.Object, connectionStringProviderMock.Object, dbOptionsConfiguratorMock.Object, serviceProviderMock.Object); } - private async Task OpenTransaction() + private async Task OpenTransaction(bool isCommand) { DbContextOptionsBuilder optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseSqlite("DataSource=:memory:"); @@ -209,11 +223,8 @@ private async Task OpenTransaction() transactionScopeState!.DbContext = db; transactionScopeState!.DbContextTransaction = await db.Database.BeginTransactionAsync(); - } - private void SetQuery() - { - operationContextState!.IsCommand = false; + operationContextState!.IsCommand = isCommand; } public void Dispose()