翼度科技»论坛 编程开发 .net 查看内容

[EF Core] EF Core Code-First 移除外键 —— 重写SQL生成器

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
[EF Core] EF Core Code-First 移除外键 —— 重写SQL生成器

使用EF Core时最烦的就是生成的某些 SQL 其实并不是你想要的结果,例如外键约束等等。
一个最简单的例子就是,因为EF Core会根据导航属性生成外键约束等原因,导致很多开发者抛弃了更易维护的Code First模式,而转为Db First以获取更自由的数据库结构。
其实我们可以通过重写EF Core的MigrationsSqlGenerator来解决:
  1. public class CustomMigrationsSqlGenerator : MigrationsSqlGenerator
  2. {
  3.     public CustomMigrationsSqlGenerator(MigrationsSqlGeneratorDependencies dependencies, IMigrationsAnnotationProvider migrationsAnnotations) : base(dependencies)
  4.     {
  5.     }
  6.     protected override void Generate(Microsoft.EntityFrameworkCore.Migrations.Operations.CreateTableOperation operation, IModel? model, MigrationCommandListBuilder builder, bool terminate = true)
  7.     {
  8.         operation.ForeignKeys.Clear();
  9.         base.Generate(operation, model, builder, terminate);
  10.     }
  11. }
复制代码
  1. public class CustomDbContext : DbContext
  2. {
  3.     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  4.     {
  5.         // ...
  6.         optionsBuilder.ReplaceService<IMigrationsSqlGenerator, CustomMigrationsSqlGenerator>();
  7.         // ...
  8.     }
  9. }
复制代码
上述代码便提供了移除ForeignKeys即表结构中的外键约束。当然,需要在DbContext中重写OnConfiguring方法,使用optionsBuilder.ReplaceService将默认的SQL生成器,替换为我们自己实现的部分,就可以在EF Core生成数据库结构时,直接去除外键约束了。
初次之外,根据MigrationsSqlGenerator暴露出来的 API 来看,我们还能做很多事情,例如重写字段的类型或者在实体上做文章,具体需要大家根据场景进行探寻了。

来源:https://www.cnblogs.com/donpangpang/archive/2023/03/17/17226543.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具