From 996f5ff4ecad30e2c7ad09ff28c91075f5478d40 Mon Sep 17 00:00:00 2001 From: Andriy Svyryd Date: Tue, 3 Dec 2024 13:31:45 -0800 Subject: [PATCH] Don't suppress transactions when creating the history repository Fixes #35127 --- .../Migrations/HistoryRepository.cs | 3 +- .../MigrationsInfrastructureTestBase.cs | 57 +++++++++++++++++++ .../MigrationCommandExecutorTest.cs | 6 +- .../CustomConvertersTestBase.cs | 4 +- 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/src/EFCore.Relational/Migrations/HistoryRepository.cs b/src/EFCore.Relational/Migrations/HistoryRepository.cs index 3c1c1b2304e..9aa9d933f9a 100644 --- a/src/EFCore.Relational/Migrations/HistoryRepository.cs +++ b/src/EFCore.Relational/Migrations/HistoryRepository.cs @@ -219,8 +219,7 @@ async Task IHistoryRepository.CreateIfNotExistsAsync(CancellationToken can private IReadOnlyList GetCreateIfNotExistsCommands() => Dependencies.MigrationsSqlGenerator.Generate([new SqlOperation { - Sql = GetCreateIfNotExistsScript(), - SuppressTransaction = true + Sql = GetCreateIfNotExistsScript() }]); /// diff --git a/test/EFCore.Relational.Specification.Tests/Migrations/MigrationsInfrastructureTestBase.cs b/test/EFCore.Relational.Specification.Tests/Migrations/MigrationsInfrastructureTestBase.cs index a00f1c67989..da798d53875 100644 --- a/test/EFCore.Relational.Specification.Tests/Migrations/MigrationsInfrastructureTestBase.cs +++ b/test/EFCore.Relational.Specification.Tests/Migrations/MigrationsInfrastructureTestBase.cs @@ -285,6 +285,62 @@ await history.GetAppliedMigrationsAsync(), x => Assert.Equal("00000000000002_Migration2", x.MigrationId)); } + [ConditionalFact] + public virtual void Can_apply_two_migrations_in_transaction() + { + using var db = Fixture.CreateContext(); + db.Database.EnsureDeleted(); + GiveMeSomeTime(db); + db.GetService().Create(); + + var strategy = db.Database.CreateExecutionStrategy(); + strategy.Execute(() => + { + using var transaction = db.Database.BeginTransaction(); + var migrator = db.GetService(); + migrator.Migrate("Migration1"); + migrator.Migrate("Migration2"); + + var history = db.GetService(); + Assert.Collection( + history.GetAppliedMigrations(), + x => Assert.Equal("00000000000001_Migration1", x.MigrationId), + x => Assert.Equal("00000000000002_Migration2", x.MigrationId)); + }); + + Assert.Equal( + LogLevel.Warning, + Fixture.TestSqlLoggerFactory.Log.First(l => l.Id == RelationalEventId.MigrationsUserTransactionWarning).Level); + } + + [ConditionalFact] + public virtual async Task Can_apply_two_migrations_in_transaction_async() + { + using var db = Fixture.CreateContext(); + await db.Database.EnsureDeletedAsync(); + await GiveMeSomeTimeAsync(db); + await db.GetService().CreateAsync(); + + var strategy = db.Database.CreateExecutionStrategy(); + await strategy.ExecuteAsync(async () => + { + using var transaction = db.Database.BeginTransactionAsync(); + var migrator = db.GetService(); + await migrator.MigrateAsync("Migration1"); + await migrator.MigrateAsync("Migration2"); + + var history = db.GetService(); + Assert.Collection( + await history.GetAppliedMigrationsAsync(), + x => Assert.Equal("00000000000001_Migration1", x.MigrationId), + x => Assert.Equal("00000000000002_Migration2", x.MigrationId)); + }); + + Assert.Equal( + LogLevel.Warning, + Fixture.TestSqlLoggerFactory.Log.First(l => l.Id == RelationalEventId.MigrationsUserTransactionWarning).Level); + } + [ConditionalFact] public virtual async Task Can_generate_no_migration_script() { @@ -549,6 +605,7 @@ public override DbContextOptionsBuilder AddOptions(DbContextOptionsBuilder build e => e .Log(RelationalEventId.PendingModelChangesWarning) .Log(RelationalEventId.NonTransactionalMigrationOperationWarning) + .Log(RelationalEventId.MigrationsUserTransactionWarning) ); protected override bool ShouldLogCategory(string logCategory) diff --git a/test/EFCore.Relational.Tests/Migrations/MigrationCommandExecutorTest.cs b/test/EFCore.Relational.Tests/Migrations/MigrationCommandExecutorTest.cs index f1ca15a4b7b..6f491c81db3 100644 --- a/test/EFCore.Relational.Tests/Migrations/MigrationCommandExecutorTest.cs +++ b/test/EFCore.Relational.Tests/Migrations/MigrationCommandExecutorTest.cs @@ -122,16 +122,14 @@ public async Task Executes_transaction_suppressed_migration_commands_in_user_tra Assert.Equal( RelationalStrings.TransactionSuppressedMigrationInUserTransaction, (await Assert.ThrowsAsync( - async () - => await migrationCommandExecutor.ExecuteNonQueryAsync(commandList, fakeConnection))).Message); + async () => await migrationCommandExecutor.ExecuteNonQueryAsync(commandList, fakeConnection))).Message); } else { Assert.Equal( RelationalStrings.TransactionSuppressedMigrationInUserTransaction, Assert.Throws( - () - => migrationCommandExecutor.ExecuteNonQuery(commandList, fakeConnection)).Message); + () => migrationCommandExecutor.ExecuteNonQuery(commandList, fakeConnection)).Message); } tx.Rollback(); diff --git a/test/EFCore.Specification.Tests/CustomConvertersTestBase.cs b/test/EFCore.Specification.Tests/CustomConvertersTestBase.cs index 5dffaf88d9a..a94b718bf99 100644 --- a/test/EFCore.Specification.Tests/CustomConvertersTestBase.cs +++ b/test/EFCore.Specification.Tests/CustomConvertersTestBase.cs @@ -1184,8 +1184,8 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con b.Property(e => e.ByteArray5) .HasConversion( new ValueConverter( - v => v.Reverse().Concat(new byte[] { 4, 20 }).ToArray(), - v => v.Reverse().Skip(2).ToArray()), + v => ((IEnumerable)v).Reverse().Concat(new byte[] { 4, 20 }).ToArray(), + v => ((IEnumerable)v).Reverse().Skip(2).ToArray()), bytesComparer) .HasMaxLength(7);