From 84d13b47577732b23d381fe273e936abb9eac882 Mon Sep 17 00:00:00 2001 From: Abdelrahman Sayed Date: Sat, 7 Mar 2026 23:04:04 +0200 Subject: [PATCH 1/2] Fix identity generation for columns in temporal history tables --- .../SqlServerMigrationsSqlGenerator.cs | 7 ++++-- .../SqlServerMigrationsSqlGeneratorTest.cs | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs b/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs index 3a3f7f6b73b..f9049539fcb 100644 --- a/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs +++ b/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs @@ -1690,9 +1690,12 @@ protected override void ColumnDefinition( } var identity = operation[SqlServerAnnotationNames.Identity] as string; - if (identity != null + var isHistoryTable = operation[SqlServerAnnotationNames.TemporalHistoryTableName] != null + || table.EndsWith("History", StringComparison.OrdinalIgnoreCase) + || table.EndsWith("History]", StringComparison.OrdinalIgnoreCase); + if ((identity != null || operation[SqlServerAnnotationNames.ValueGenerationStrategy] as SqlServerValueGenerationStrategy? - == SqlServerValueGenerationStrategy.IdentityColumn) + == SqlServerValueGenerationStrategy.IdentityColumn) && !isHistoryTable) { builder.Append(" IDENTITY"); diff --git a/test/EFCore.SqlServer.FunctionalTests/Migrations/SqlServerMigrationsSqlGeneratorTest.cs b/test/EFCore.SqlServer.FunctionalTests/Migrations/SqlServerMigrationsSqlGeneratorTest.cs index 22ddb64c6bf..22ad8b69b3e 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Migrations/SqlServerMigrationsSqlGeneratorTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Migrations/SqlServerMigrationsSqlGeneratorTest.cs @@ -1287,6 +1287,30 @@ public void Invalid_column_type_for_unmappable_clr_type_throws_meaningful_except Assert.Equal(RelationalStrings.UnsupportedTypeForColumn("TestTable", "TestColumn", "FileStream"), ex.Message); } + [ConditionalFact] + public void Migration_should_not_generate_identity_on_history_table_column() + { + var operation = new AddColumnOperation + { + Table = "CustomersHistory", + Name = "NewColumn", + ClrType = typeof(int), + ColumnType = "int", + IsNullable = false, + [SqlServerAnnotationNames.Identity] = "1, 1" + }; + + Generate( + builder => builder.Entity("Customer", eb => + { + eb.Property("Id").ValueGeneratedOnAdd(); + eb.ToTable("Customers", tb => tb.IsTemporal()); + }), + operation); + + Assert.DoesNotContain("IDENTITY", Sql); + } + private static void CreateGotModel(ModelBuilder b) => b.HasDefaultSchema("dbo").Entity( "Person", pb => From 400bd627def81a03e9641e561966698e5aca896f Mon Sep 17 00:00:00 2001 From: Abdelrahman Sayed Date: Sat, 7 Mar 2026 23:20:55 +0200 Subject: [PATCH 2/2] Update historyTable check --- .../Migrations/SqlServerMigrationsSqlGenerator.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs b/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs index f9049539fcb..da7f7309755 100644 --- a/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs +++ b/src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs @@ -1690,9 +1690,10 @@ protected override void ColumnDefinition( } var identity = operation[SqlServerAnnotationNames.Identity] as string; - var isHistoryTable = operation[SqlServerAnnotationNames.TemporalHistoryTableName] != null - || table.EndsWith("History", StringComparison.OrdinalIgnoreCase) - || table.EndsWith("History]", StringComparison.OrdinalIgnoreCase); + var isHistoryTable = model?.GetRelationalModel().Tables + .Any(t => t.FindAnnotation(SqlServerAnnotationNames.TemporalHistoryTableName)?.Value as string == table + && (t.FindAnnotation(SqlServerAnnotationNames.TemporalHistoryTableSchema)?.Value as string ?? t.Schema) == schema) == true; + if ((identity != null || operation[SqlServerAnnotationNames.ValueGenerationStrategy] as SqlServerValueGenerationStrategy? == SqlServerValueGenerationStrategy.IdentityColumn) && !isHistoryTable)