From 88b6e7e13ff9cc83e8598c51564cb8e0412c690a Mon Sep 17 00:00:00 2001 From: jogibear9988 Date: Mon, 30 Mar 2026 22:55:05 +0200 Subject: [PATCH 1/4] Add support to disable Foreign Keys in Sqlite --- src/Migrator/Framework/MigrationAttribute.cs | 5 +++++ src/Migrator/MigrateAnywhere.cs | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Migrator/Framework/MigrationAttribute.cs b/src/Migrator/Framework/MigrationAttribute.cs index 483e2f3d..48a75152 100644 --- a/src/Migrator/Framework/MigrationAttribute.cs +++ b/src/Migrator/Framework/MigrationAttribute.cs @@ -55,4 +55,9 @@ public bool Ignore get { return _ignore; } set { _ignore = value; } } + + /// + /// Disable Foreign Keys in Sqlite + /// + public bool DisableForeignKeysInSqlite { get; set; } } diff --git a/src/Migrator/MigrateAnywhere.cs b/src/Migrator/MigrateAnywhere.cs index b75bf099..9bc59490 100644 --- a/src/Migrator/MigrateAnywhere.cs +++ b/src/Migrator/MigrateAnywhere.cs @@ -3,6 +3,7 @@ using System.Reflection; using DotNetProjects.Migrator.Framework; using DotNetProjects.Migrator.Providers; +using DotNetProjects.Migrator.Providers.Impl.SQLite; namespace DotNetProjects.Migrator; @@ -63,13 +64,17 @@ public override bool Continue(long version) public override void Migrate(IMigration migration) { - _provider.BeginTransaction(); #if NETSTANDARD var attr = migration.GetType().GetTypeInfo().GetCustomAttribute(); #else var attr = (MigrationAttribute)Attribute.GetCustomAttribute(migration.GetType(), typeof(MigrationAttribute)); #endif - + if (attr.DisableForeignKeysInSqlite && _provider is SQLiteTransformationProvider sqlite) + { + sqlite.SetPragmaForeignKeys(false); + } + + _provider.BeginTransaction(); if (_provider.AppliedMigrations.Contains(attr.Version)) { @@ -78,6 +83,11 @@ public override void Migrate(IMigration migration) else { ApplyMigration(migration, attr); + } + + if (attr.DisableForeignKeysInSqlite && _provider is SQLiteTransformationProvider sqlite2) + { + sqlite2.SetPragmaForeignKeys(true); } } From 7f8fe1bb53c178da0977f3e752c7d78b5b75a306 Mon Sep 17 00:00:00 2001 From: jogibear9988 Date: Mon, 30 Mar 2026 22:58:18 +0200 Subject: [PATCH 2/4] tets for pragma --- src/Migrator.Tests/Data/TestMigrations.cs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Migrator.Tests/Data/TestMigrations.cs b/src/Migrator.Tests/Data/TestMigrations.cs index 1413c9c9..3c1ec049 100644 --- a/src/Migrator.Tests/Data/TestMigrations.cs +++ b/src/Migrator.Tests/Data/TestMigrations.cs @@ -1,4 +1,5 @@ using DotNetProjects.Migrator.Framework; +using DotNetProjects.Migrator.Providers.Impl.SQLite; namespace Migrator.Tests.Data; @@ -63,4 +64,23 @@ public virtual void AfterDown() public virtual void InitializeOnce(string[] args) { } -} \ No newline at end of file +} + +[Migration(3, DisableForeignKeysInSqlite = true)] +public class ThirdTestMigration : Migration +{ + public override void Up() + { + if (this.Database is SQLiteTransformationProvider sqlite) + { + if (sqlite.IsPragmaForeignKeysOn()) + { + throw new System.Exception("Disableling of Foreign keys was not possible"); + } + } + } + + public override void Down() + { + } +} From ea77c7663d5cc523f1dffe2069db3c27ecfdd79c Mon Sep 17 00:00:00 2001 From: jogibear9988 Date: Tue, 31 Mar 2026 08:20:09 +0200 Subject: [PATCH 3/4] only switch back if foreign keys was on --- src/Migrator/MigrateAnywhere.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Migrator/MigrateAnywhere.cs b/src/Migrator/MigrateAnywhere.cs index 9bc59490..f4d99985 100644 --- a/src/Migrator/MigrateAnywhere.cs +++ b/src/Migrator/MigrateAnywhere.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Reflection; using DotNetProjects.Migrator.Framework; using DotNetProjects.Migrator.Providers; using DotNetProjects.Migrator.Providers.Impl.SQLite; @@ -68,10 +67,15 @@ public override void Migrate(IMigration migration) var attr = migration.GetType().GetTypeInfo().GetCustomAttribute(); #else var attr = (MigrationAttribute)Attribute.GetCustomAttribute(migration.GetType(), typeof(MigrationAttribute)); -#endif +#endif + var foreignKeysWasOn = false; if (attr.DisableForeignKeysInSqlite && _provider is SQLiteTransformationProvider sqlite) { - sqlite.SetPragmaForeignKeys(false); + foreignKeysWasOn = sqlite.IsPragmaForeignKeysOn(); + if (foreignKeysWasOn) + { + sqlite.SetPragmaForeignKeys(false); + } } _provider.BeginTransaction(); @@ -85,7 +89,7 @@ public override void Migrate(IMigration migration) ApplyMigration(migration, attr); } - if (attr.DisableForeignKeysInSqlite && _provider is SQLiteTransformationProvider sqlite2) + if (foreignKeysWasOn && _provider is SQLiteTransformationProvider sqlite2) { sqlite2.SetPragmaForeignKeys(true); } From 4e8427f84fadc77c474b7ca67b83566d046a6a5d Mon Sep 17 00:00:00 2001 From: jogibear9988 Date: Tue, 31 Mar 2026 08:22:50 +0200 Subject: [PATCH 4/4] disable foreign keys in sqlite always --- src/Migrator.Tests/Data/TestMigrations.cs | 20 -------------------- src/Migrator/Framework/MigrationAttribute.cs | 5 ----- src/Migrator/MigrateAnywhere.cs | 2 +- 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/src/Migrator.Tests/Data/TestMigrations.cs b/src/Migrator.Tests/Data/TestMigrations.cs index 3c1ec049..a6541559 100644 --- a/src/Migrator.Tests/Data/TestMigrations.cs +++ b/src/Migrator.Tests/Data/TestMigrations.cs @@ -1,5 +1,4 @@ using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers.Impl.SQLite; namespace Migrator.Tests.Data; @@ -65,22 +64,3 @@ public virtual void InitializeOnce(string[] args) { } } - -[Migration(3, DisableForeignKeysInSqlite = true)] -public class ThirdTestMigration : Migration -{ - public override void Up() - { - if (this.Database is SQLiteTransformationProvider sqlite) - { - if (sqlite.IsPragmaForeignKeysOn()) - { - throw new System.Exception("Disableling of Foreign keys was not possible"); - } - } - } - - public override void Down() - { - } -} diff --git a/src/Migrator/Framework/MigrationAttribute.cs b/src/Migrator/Framework/MigrationAttribute.cs index 48a75152..483e2f3d 100644 --- a/src/Migrator/Framework/MigrationAttribute.cs +++ b/src/Migrator/Framework/MigrationAttribute.cs @@ -55,9 +55,4 @@ public bool Ignore get { return _ignore; } set { _ignore = value; } } - - /// - /// Disable Foreign Keys in Sqlite - /// - public bool DisableForeignKeysInSqlite { get; set; } } diff --git a/src/Migrator/MigrateAnywhere.cs b/src/Migrator/MigrateAnywhere.cs index f4d99985..2c374902 100644 --- a/src/Migrator/MigrateAnywhere.cs +++ b/src/Migrator/MigrateAnywhere.cs @@ -69,7 +69,7 @@ public override void Migrate(IMigration migration) var attr = (MigrationAttribute)Attribute.GetCustomAttribute(migration.GetType(), typeof(MigrationAttribute)); #endif var foreignKeysWasOn = false; - if (attr.DisableForeignKeysInSqlite && _provider is SQLiteTransformationProvider sqlite) + if (_provider is SQLiteTransformationProvider sqlite) { foreignKeysWasOn = sqlite.IsPragmaForeignKeysOn(); if (foreignKeysWasOn)