diff --git a/src/EFCore.Sqlite.Core/Migrations/SqliteMigrationsSqlGenerator.cs b/src/EFCore.Sqlite.Core/Migrations/SqliteMigrationsSqlGenerator.cs index d1d6e7e23ff..a78d9d7ff22 100644 --- a/src/EFCore.Sqlite.Core/Migrations/SqliteMigrationsSqlGenerator.cs +++ b/src/EFCore.Sqlite.Core/Migrations/SqliteMigrationsSqlGenerator.cs @@ -441,7 +441,7 @@ private IReadOnlyList RewriteOperations( if (rebuilds.Any()) { operations.Add( - new SqlOperation { Sql = "PRAGMA foreign_keys = 0;", SuppressTransaction = true }); + new SqlOperation { Sql = "PRAGMA defer_foreign_keys = ON;", SuppressTransaction = false }); } foreach (var ((table, schema), _) in rebuilds) @@ -458,12 +458,6 @@ private IReadOnlyList RewriteOperations( }); } - if (rebuilds.Any()) - { - operations.Add( - new SqlOperation { Sql = "PRAGMA foreign_keys = 1;", SuppressTransaction = true }); - } - foreach (var index in indexesToRebuild) { operations.Add(CreateIndexOperation.CreateFrom(index)); diff --git a/test/EFCore.Sqlite.FunctionalTests/Migrations/MigrationsSqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/Migrations/MigrationsSqliteTest.cs index e3a82cc168d..acdfd8476e5 100644 --- a/test/EFCore.Sqlite.FunctionalTests/Migrations/MigrationsSqliteTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/Migrations/MigrationsSqliteTest.cs @@ -162,7 +162,7 @@ public override async Task Alter_table_add_comment() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -171,10 +171,6 @@ public override async Task Alter_table_add_comment() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -198,7 +194,7 @@ public override async Task Alter_table_add_comment_non_default_schema() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -207,10 +203,6 @@ public override async Task Alter_table_add_comment_non_default_schema() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -234,7 +226,7 @@ public override async Task Alter_table_change_comment() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -243,10 +235,6 @@ public override async Task Alter_table_change_comment() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -268,7 +256,7 @@ public override async Task Alter_table_remove_comment() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -277,10 +265,6 @@ public override async Task Alter_table_remove_comment() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -306,7 +290,7 @@ public override async Task Rename_table() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -315,10 +299,6 @@ public override async Task Rename_table() // """ ALTER TABLE "ef_temp_Persons" RENAME TO "Persons"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -344,7 +324,7 @@ public override async Task Rename_table_with_primary_key() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -353,10 +333,6 @@ public override async Task Rename_table_with_primary_key() // """ ALTER TABLE "ef_temp_Persons" RENAME TO "Persons"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -385,7 +361,7 @@ public override async Task Rename_table_with_json_column() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -394,10 +370,6 @@ public override async Task Rename_table_with_json_column() // """ ALTER TABLE "ef_temp_NewEntities" RENAME TO "NewEntities"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -508,7 +480,7 @@ public override async Task Add_column_with_comment() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -517,10 +489,6 @@ public override async Task Add_column_with_comment() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -568,7 +536,7 @@ public override async Task Add_column_with_check_constraint() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -577,10 +545,6 @@ public override async Task Add_column_with_check_constraint() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -603,7 +567,7 @@ public override async Task Alter_column_make_required() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -612,10 +576,6 @@ public override async Task Alter_column_make_required() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -638,7 +598,7 @@ public override async Task Alter_column_make_required_with_index() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -647,10 +607,6 @@ public override async Task Alter_column_make_required_with_index() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """, // """ @@ -678,7 +634,7 @@ public override async Task Alter_column_make_required_with_composite_index() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -687,10 +643,6 @@ public override async Task Alter_column_make_required_with_composite_index() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """, // """ @@ -721,7 +673,7 @@ public override async Task Alter_column_make_computed(bool? stored) """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -730,10 +682,6 @@ public override async Task Alter_column_make_computed(bool? stored) // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -758,7 +706,7 @@ public override async Task Alter_column_change_computed() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -767,10 +715,6 @@ public override async Task Alter_column_change_computed() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -795,7 +739,7 @@ public override async Task Alter_column_change_computed_recreates_indexes() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -804,10 +748,6 @@ public override async Task Alter_column_change_computed_recreates_indexes() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """, // """ @@ -836,7 +776,7 @@ public override async Task Alter_column_change_computed_type() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -845,10 +785,6 @@ public override async Task Alter_column_change_computed_type() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -873,7 +809,7 @@ public override async Task Alter_column_make_non_computed() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -882,10 +818,6 @@ public override async Task Alter_column_make_non_computed() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -908,7 +840,7 @@ public override async Task Alter_column_add_comment() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -917,10 +849,6 @@ public override async Task Alter_column_add_comment() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -945,7 +873,7 @@ public override async Task Alter_computed_column_add_comment() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -954,10 +882,6 @@ public override async Task Alter_computed_column_add_comment() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -980,7 +904,7 @@ public override async Task Alter_column_change_comment() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -989,10 +913,6 @@ public override async Task Alter_column_change_comment() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1014,7 +934,7 @@ public override async Task Alter_column_remove_comment() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1023,10 +943,6 @@ public override async Task Alter_column_remove_comment() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1048,7 +964,7 @@ public override async Task Alter_column_set_collation() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1057,10 +973,6 @@ public override async Task Alter_column_set_collation() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1082,7 +994,7 @@ public override async Task Alter_column_reset_collation() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1091,10 +1003,6 @@ public override async Task Alter_column_reset_collation() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1159,7 +1067,7 @@ public override async Task Convert_json_entities_to_regular_owned() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1168,10 +1076,6 @@ public override async Task Convert_json_entities_to_regular_owned() // """ ALTER TABLE "ef_temp_Entity" RENAME TO "Entity"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1216,7 +1120,7 @@ public override async Task Convert_regular_owned_entities_to_json() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1225,10 +1129,6 @@ public override async Task Convert_regular_owned_entities_to_json() // """ ALTER TABLE "ef_temp_Entity" RENAME TO "Entity"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1258,7 +1158,7 @@ public override async Task Convert_string_column_to_a_json_column_containing_req """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1267,10 +1167,6 @@ public override async Task Convert_string_column_to_a_json_column_containing_req // """ ALTER TABLE "ef_temp_Entity" RENAME TO "Entity"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1299,7 +1195,7 @@ public override async Task Drop_column() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1308,10 +1204,6 @@ public override async Task Drop_column() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1333,7 +1225,7 @@ public override async Task Drop_column_primary_key() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1342,10 +1234,6 @@ public override async Task Drop_column_primary_key() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1368,7 +1256,7 @@ public override async Task Drop_json_columns_from_existing_table() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1377,10 +1265,6 @@ public override async Task Drop_json_columns_from_existing_table() // """ ALTER TABLE "ef_temp_Entity" RENAME TO "Entity"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1460,7 +1344,7 @@ public override async Task Add_primary_key_int() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1469,10 +1353,6 @@ public override async Task Add_primary_key_int() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1494,7 +1374,7 @@ public override async Task Add_primary_key_string() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1503,10 +1383,6 @@ public override async Task Add_primary_key_string() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1528,7 +1404,7 @@ SELECT IFNULL("SomeField", '') """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1537,10 +1413,6 @@ SELECT IFNULL("SomeField", '') // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1564,7 +1436,7 @@ public override async Task Add_primary_key_composite_with_name() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1573,10 +1445,6 @@ public override async Task Add_primary_key_composite_with_name() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1598,7 +1466,7 @@ public override async Task Drop_primary_key_int() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1607,10 +1475,6 @@ public override async Task Drop_primary_key_int() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1632,7 +1496,7 @@ public override async Task Drop_primary_key_string() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1641,10 +1505,6 @@ public override async Task Drop_primary_key_string() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1672,7 +1532,7 @@ public override async Task Add_foreign_key() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1681,10 +1541,6 @@ public override async Task Add_foreign_key() // """ ALTER TABLE "ef_temp_Orders" RENAME TO "Orders"; -""", - // - """ -PRAGMA foreign_keys = 1; """, // """ @@ -1716,7 +1572,7 @@ public override async Task Add_foreign_key_with_name() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1725,10 +1581,6 @@ public override async Task Add_foreign_key_with_name() // """ ALTER TABLE "ef_temp_Orders" RENAME TO "Orders"; -""", - // - """ -PRAGMA foreign_keys = 1; """, // """ @@ -1759,7 +1611,7 @@ public override async Task Drop_foreign_key() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1768,10 +1620,6 @@ public override async Task Drop_foreign_key() // """ ALTER TABLE "ef_temp_Orders" RENAME TO "Orders"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1795,7 +1643,7 @@ public override async Task Add_unique_constraint() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1804,10 +1652,6 @@ public override async Task Add_unique_constraint() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1832,7 +1676,7 @@ public override async Task Add_unique_constraint_composite_with_name() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1841,10 +1685,6 @@ public override async Task Add_unique_constraint_composite_with_name() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1867,7 +1707,7 @@ public override async Task Drop_unique_constraint() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1876,10 +1716,6 @@ public override async Task Drop_unique_constraint() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1903,7 +1739,7 @@ public override async Task Add_check_constraint_with_name() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1912,10 +1748,6 @@ public override async Task Add_check_constraint_with_name() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1939,7 +1771,7 @@ public override async Task Alter_check_constraint() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1948,10 +1780,6 @@ public override async Task Alter_check_constraint() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } @@ -1974,7 +1802,7 @@ public override async Task Drop_check_constraint() """, // """ -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; """, // """ @@ -1983,10 +1811,6 @@ public override async Task Drop_check_constraint() // """ ALTER TABLE "ef_temp_People" RENAME TO "People"; -""", - // - """ -PRAGMA foreign_keys = 1; """); } diff --git a/test/EFCore.Sqlite.FunctionalTests/Migrations/SqliteMigrationsSqlGeneratorTest.cs b/test/EFCore.Sqlite.FunctionalTests/Migrations/SqliteMigrationsSqlGeneratorTest.cs index 6b2fe9c9f49..6697e26cc36 100644 --- a/test/EFCore.Sqlite.FunctionalTests/Migrations/SqliteMigrationsSqlGeneratorTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/Migrations/SqliteMigrationsSqlGeneratorTest.cs @@ -834,16 +834,13 @@ public virtual void DropColumn_defers_subsequent_RenameColumn() FROM "Blog"; GO -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; GO DROP TABLE "Blog"; GO ALTER TABLE "ef_temp_Blog" RENAME TO "Blog"; -GO - -PRAGMA foreign_keys = 1; """); } @@ -885,16 +882,13 @@ public virtual void Deferred_RenameColumn_defers_subsequent_AddColumn() FROM "Blog"; GO -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; GO DROP TABLE "Blog"; GO ALTER TABLE "ef_temp_Blog" RENAME TO "Blog"; -GO - -PRAGMA foreign_keys = 1; """); } @@ -939,16 +933,13 @@ public virtual void Deferred_RenameColumn_defers_subsequent_CreateIndex_unique() FROM "Blog"; GO -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; GO DROP TABLE "Blog"; GO ALTER TABLE "ef_temp_Blog" RENAME TO "Blog"; -GO - -PRAGMA foreign_keys = 1; """); } @@ -988,16 +979,13 @@ public virtual void DropColumn_defers_subsequent_AddColumn_required() FROM "Blog"; GO -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; GO DROP TABLE "Blog"; GO ALTER TABLE "ef_temp_Blog" RENAME TO "Blog"; -GO - -PRAGMA foreign_keys = 1; """); } @@ -1040,7 +1028,7 @@ public virtual void Deferred_AddColumn_defers_subsequent_CreateIndex() FROM "Blog"; GO -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; GO DROP TABLE "Blog"; @@ -1049,9 +1037,6 @@ public virtual void Deferred_AddColumn_defers_subsequent_CreateIndex() ALTER TABLE "ef_temp_Blog" RENAME TO "Blog"; GO -PRAGMA foreign_keys = 1; -GO - CREATE INDEX "IX_Blog_Name" ON "Blog" ("Name"); """); } @@ -1089,16 +1074,13 @@ public virtual void DropColumn_in_table_which_has_another_spatial_column() FROM "Blog"; GO -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; GO DROP TABLE "Blog"; GO ALTER TABLE "ef_temp_Blog" RENAME TO "Blog"; -GO - -PRAGMA foreign_keys = 1; """); } @@ -1132,16 +1114,13 @@ public virtual void RenameTable_preserves_pending_rebuilds() FROM "Blog"; GO -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; GO DROP TABLE "Blog"; GO ALTER TABLE "ef_temp_Blog" RENAME TO "Blog"; -GO - -PRAGMA foreign_keys = 1; """); } @@ -1171,16 +1150,13 @@ public virtual void Rebuild_preserves_column_order() FROM "Ordinal"; GO -PRAGMA foreign_keys = 0; +PRAGMA defer_foreign_keys = ON; GO DROP TABLE "Ordinal"; GO ALTER TABLE "ef_temp_Ordinal" RENAME TO "Ordinal"; -GO - -PRAGMA foreign_keys = 1; """); } }