Skip to content

Commit 996f5ff

Browse files
committed
Don't suppress transactions when creating the history repository
Fixes #35127
1 parent bb72406 commit 996f5ff

File tree

4 files changed

+62
-8
lines changed

4 files changed

+62
-8
lines changed

src/EFCore.Relational/Migrations/HistoryRepository.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,7 @@ async Task<bool> IHistoryRepository.CreateIfNotExistsAsync(CancellationToken can
219219
private IReadOnlyList<MigrationCommand> GetCreateIfNotExistsCommands()
220220
=> Dependencies.MigrationsSqlGenerator.Generate([new SqlOperation
221221
{
222-
Sql = GetCreateIfNotExistsScript(),
223-
SuppressTransaction = true
222+
Sql = GetCreateIfNotExistsScript()
224223
}]);
225224

226225
/// <summary>

test/EFCore.Relational.Specification.Tests/Migrations/MigrationsInfrastructureTestBase.cs

+57
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,62 @@ await history.GetAppliedMigrationsAsync(),
285285
x => Assert.Equal("00000000000002_Migration2", x.MigrationId));
286286
}
287287

288+
[ConditionalFact]
289+
public virtual void Can_apply_two_migrations_in_transaction()
290+
{
291+
using var db = Fixture.CreateContext();
292+
db.Database.EnsureDeleted();
293+
GiveMeSomeTime(db);
294+
db.GetService<IRelationalDatabaseCreator>().Create();
295+
296+
var strategy = db.Database.CreateExecutionStrategy();
297+
strategy.Execute(() =>
298+
{
299+
using var transaction = db.Database.BeginTransaction();
300+
var migrator = db.GetService<IMigrator>();
301+
migrator.Migrate("Migration1");
302+
migrator.Migrate("Migration2");
303+
304+
var history = db.GetService<IHistoryRepository>();
305+
Assert.Collection(
306+
history.GetAppliedMigrations(),
307+
x => Assert.Equal("00000000000001_Migration1", x.MigrationId),
308+
x => Assert.Equal("00000000000002_Migration2", x.MigrationId));
309+
});
310+
311+
Assert.Equal(
312+
LogLevel.Warning,
313+
Fixture.TestSqlLoggerFactory.Log.First(l => l.Id == RelationalEventId.MigrationsUserTransactionWarning).Level);
314+
}
315+
316+
[ConditionalFact]
317+
public virtual async Task Can_apply_two_migrations_in_transaction_async()
318+
{
319+
using var db = Fixture.CreateContext();
320+
await db.Database.EnsureDeletedAsync();
321+
await GiveMeSomeTimeAsync(db);
322+
await db.GetService<IRelationalDatabaseCreator>().CreateAsync();
323+
324+
var strategy = db.Database.CreateExecutionStrategy();
325+
await strategy.ExecuteAsync(async () =>
326+
{
327+
using var transaction = db.Database.BeginTransactionAsync();
328+
var migrator = db.GetService<IMigrator>();
329+
await migrator.MigrateAsync("Migration1");
330+
await migrator.MigrateAsync("Migration2");
331+
332+
var history = db.GetService<IHistoryRepository>();
333+
Assert.Collection(
334+
await history.GetAppliedMigrationsAsync(),
335+
x => Assert.Equal("00000000000001_Migration1", x.MigrationId),
336+
x => Assert.Equal("00000000000002_Migration2", x.MigrationId));
337+
});
338+
339+
Assert.Equal(
340+
LogLevel.Warning,
341+
Fixture.TestSqlLoggerFactory.Log.First(l => l.Id == RelationalEventId.MigrationsUserTransactionWarning).Level);
342+
}
343+
288344
[ConditionalFact]
289345
public virtual async Task Can_generate_no_migration_script()
290346
{
@@ -549,6 +605,7 @@ public override DbContextOptionsBuilder AddOptions(DbContextOptionsBuilder build
549605
e => e
550606
.Log(RelationalEventId.PendingModelChangesWarning)
551607
.Log(RelationalEventId.NonTransactionalMigrationOperationWarning)
608+
.Log(RelationalEventId.MigrationsUserTransactionWarning)
552609
);
553610

554611
protected override bool ShouldLogCategory(string logCategory)

test/EFCore.Relational.Tests/Migrations/MigrationCommandExecutorTest.cs

+2-4
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,14 @@ public async Task Executes_transaction_suppressed_migration_commands_in_user_tra
122122
Assert.Equal(
123123
RelationalStrings.TransactionSuppressedMigrationInUserTransaction,
124124
(await Assert.ThrowsAsync<NotSupportedException>(
125-
async ()
126-
=> await migrationCommandExecutor.ExecuteNonQueryAsync(commandList, fakeConnection))).Message);
125+
async () => await migrationCommandExecutor.ExecuteNonQueryAsync(commandList, fakeConnection))).Message);
127126
}
128127
else
129128
{
130129
Assert.Equal(
131130
RelationalStrings.TransactionSuppressedMigrationInUserTransaction,
132131
Assert.Throws<NotSupportedException>(
133-
()
134-
=> migrationCommandExecutor.ExecuteNonQuery(commandList, fakeConnection)).Message);
132+
() => migrationCommandExecutor.ExecuteNonQuery(commandList, fakeConnection)).Message);
135133
}
136134

137135
tx.Rollback();

test/EFCore.Specification.Tests/CustomConvertersTestBase.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1184,8 +1184,8 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con
11841184
b.Property(e => e.ByteArray5)
11851185
.HasConversion(
11861186
new ValueConverter<byte[], byte[]>(
1187-
v => v.Reverse().Concat(new byte[] { 4, 20 }).ToArray(),
1188-
v => v.Reverse().Skip(2).ToArray()),
1187+
v => ((IEnumerable<byte>)v).Reverse().Concat(new byte[] { 4, 20 }).ToArray(),
1188+
v => ((IEnumerable<byte>)v).Reverse().Skip(2).ToArray()),
11891189
bytesComparer)
11901190
.HasMaxLength(7);
11911191

0 commit comments

Comments
 (0)