You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core中SqlServerMigrationSqlGenerator的等效替代实现方法

EF Core 中自定义迁移SQL生成器的等效实现

EF Core 没有沿用传统EF6的DbConfiguration+SqlServerMigrationSqlGenerator挂载模式,对应自定义SQL生成逻辑的实现方式为:继承EF Core内置的SqlServerMigrationsSqlGenerator类重写生成逻辑,再通过DbContext配置替换内置服务即可,你原有的审计字段自动赋值、跳过视图实体建表的逻辑可以完整迁移。


1. 编写自定义SQL生成器类

注意EF Core中迁移操作相关类型的命名空间、类名和EF6有差异,对应你原有逻辑的实现代码如下:

using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Migrations.Operations;

public class StandardAuditSqlServerMigrationsSqlGenerator : SqlServerMigrationsSqlGenerator
{
    // 必须实现带依赖参数的构造函数,供EF Core依赖注入容器调用
    public StandardAuditSqlServerMigrationsSqlGenerator(
        MigrationsSqlGeneratorDependencies dependencies,
        ICommandBatchPreparer commandBatchPreparer) 
        : base(dependencies, commandBatchPreparer)
    {
    }

    protected override void Generate(
        AddColumnOperation operation, 
        IModel? model, 
        MigrationCommandListBuilder builder, 
        bool terminate = true)
    {
        ConfigureAuditColumns(operation);
        base.Generate(operation, model, builder, terminate);
    }

    protected override void Generate(
        CreateTableOperation operation, 
        IModel? model, 
        MigrationCommandListBuilder builder, 
        bool terminate = true)
    {
        // 标记为视图的实体直接跳过,不生成建表语句
        if (operation.FindAnnotation(typeof(IsDatabaseViewEntity).Name) != null)
        {
            return;
        }
        ConfigureAuditColumns(operation.Columns);
        base.Generate(operation, model, builder, terminate);
    }

    private void ConfigureAuditColumns(IEnumerable<ColumnOperation> columns)
    {
        foreach (var column in columns)
        {
            if (column.Name == "CreatedDateTime" || column.Name == "UpdatedDateTime")
            {
                column.DefaultValueSql = "GETUTCDATE()";
            }
        }
    }
}

注意:EF Core中对应EF6ColumnModel的类型是ColumnOperation,操作类的注解读取需要调用FindAnnotation()方法,不要直接访问Annotations字典。

2. 注册自定义生成器到DbContext

不需要保留EF6的DbMigrationsConfiguration类,直接在DbContext的OnConfiguring方法中替换内置的迁移SQL生成器服务即可:

public class WorkflowComponentDbContext : DbContext
{
    // 此处省略你的DbSet定义、其他业务逻辑

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            // 保留你原有的数据库连接配置
            optionsBuilder.UseSqlServer("你的数据库连接字符串", sqlOpts =>
            {
                // 迁移程序集、重试策略等原有SqlServer相关配置都可以写在这里
                sqlOpts.MigrationsAssembly(typeof(WorkflowComponentDbContext).Assembly.FullName);
            });
        }

        // 替换EF Core默认的SQL Server迁移生成器为自定义实现
        optionsBuilder.ReplaceService<IMigrationsSqlGenerator, StandardAuditSqlServerMigrationsSqlGenerator>();
    }
}

补充说明

  • 上述实现兼容EF Core 3.0及以上所有版本,仅需要项目引用Microsoft.EntityFrameworkCore.SqlServer包,不需要额外依赖
  • 原EF6中AutomaticMigrationsEnabled配置在EF Core中默认关闭,不需要手动设置
  • 视图实体跳过建表逻辑也可以用EF Core原生API实现:在实体映射中调用ToView("视图名称")配置后,EF Core默认就不会为该实体生成建表迁移语句,不需要自定义注解拦截,可按需选择
  • 如果需要扩展其他迁移操作的生成逻辑,直接重写SqlServerMigrationsSqlGenerator中对应操作的Generate方法重载即可,使用逻辑和EF6完全一致。

内容的提问来源于stack exchange,提问作者Prisoner ZERO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:42:51