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中对应EF6
ColumnModel的类型是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
相关产品推荐
相关产品推荐

