EF Core 6中能否自动生成带表存在判断的迁移文件?
在EF Core 6中自动生成含表存在判断的迁移文件
完全可以通过自定义迁移SQL生成逻辑实现,不用每次手动修改Up方法。具体步骤如下:
1. 自定义迁移SQL生成器
继承EF Core默认的SqlServerMigrationsSqlGenerator(如果使用其他数据库,替换为对应数据库的生成器),重写Generate(CreateTableOperation)方法,在生成建表SQL前加入表是否存在的判断:
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations.Operations; using Microsoft.EntityFrameworkCore.Storage; public class CustomSqlServerMigrationsSqlGenerator : SqlServerMigrationsSqlGenerator { public CustomSqlServerMigrationsSqlGenerator( MigrationsSqlGeneratorDependencies dependencies, IRelationalAnnotationProvider annotationsProvider) : base(dependencies, annotationsProvider) { } protected override void Generate(CreateTableOperation operation) { // 先判断表是否存在,不存在才执行建表 Sql($@"IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = N'{operation.Name}' AND schema_id = SCHEMA_ID(N'{operation.Schema}')) BEGIN"); // 调用默认逻辑生成建表SQL base.Generate(operation); Sql("END"); } }
2. 注册自定义生成器
在你的DbContext配置中,替换默认的迁移SQL生成器服务:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; public class YourDbContext : DbContext { // 其他DbContext代码... protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder .UseSqlServer("YourConnectionString") .ReplaceService<IMigrationsSqlGenerator, CustomSqlServerMigrationsSqlGenerator>(); } }
3. 生成迁移
之后执行Add-Migration或者dotnet ef migrations add命令生成迁移文件时,Up方法里的建表语句就会自动包含表存在判断逻辑,无需手动修改。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

