[EF Core] EF Core Code-First 移除外键 —— 重写SQL生成器
[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 来看,我们还能做很多事情,例如重写字段的类型或者在实体上做文章,具体需要大家根据场景进行探寻了。
分类:
EF Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构