#[EF Core] EF Core Code-First 移除外鍵 —— 重寫SQL生成器 使用EF Core時最煩的就是生成的某些 SQL 其實並不是你想要的結果,例如外鍵約束等等。 一個最簡單的例子就是,因為EF Core會根據導航屬性生成外鍵約束等原因,導致很多開發者拋棄了更易維護的Code ...
[EF Core] EF Core Code-First 移除外鍵 —— 重寫SQL生成器
使用EF Core
時最煩的就是生成的某些 SQL 其實並不是你想要的結果,例如外鍵約束等等。
一個最簡單的例子就是,因為EF Core
會根據導航屬性生成外鍵約束等原因,導致很多開發者拋棄了更易維護的Code First
模式,而轉為Db First
以獲取更自由的資料庫結構。
其實我們可以通過重寫EF Core
的MigrationsSqlGenerator
來解決:
public class CustomMigrationsSqlGenerator : MigrationsSqlGenerator
{
public CustomMigrationsSqlGenerator(MigrationsSqlGeneratorDependencies dependencies, IMigrationsAnnotationProvider migrationsAnnotations) : base(dependencies)
{
}
protected override void Generate(Microsoft.EntityFrameworkCore.Migrations.Operations.CreateTableOperation operation, IModel? model, MigrationCommandListBuilder builder, bool terminate = true)
{
operation.ForeignKeys.Clear();
base.Generate(operation, model, builder, terminate);
}
}
public class CustomDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// ...
optionsBuilder.ReplaceService<IMigrationsSqlGenerator, CustomMigrationsSqlGenerator>();
// ...
}
}
上述代碼便提供了移除ForeignKeys
即表結構中的外鍵約束。當然,需要在DbContext
中重寫OnConfiguring
方法,使用optionsBuilder.ReplaceService
將預設的SQL生成器,替換為我們自己實現的部分,就可以在EF Core
生成資料庫結構時,直接去除外鍵約束了。
初次之外,根據MigrationsSqlGenerator
暴露出來的 API 來看,我們還能做很多事情,例如重寫欄位的類型或者在實體上做文章,具體需要大家根據場景進行探尋了。