EntityFramework核心MySQL脚本迁移导出自定义

时间:2019-06-13 18:16:18

标签: c# mysql entity-framework entity-framework-core

当我在使用EntityFramework Core 2和MySql的项目中运行Script-Migration时,它会生成正确的语句集,但是在200条语句中,只有5个缺少分号。我已经在以下链接中找到了在EntityFramework 6中覆盖MySqlMigrationSqlGenerator配置的解决方案:EF6 MySql: Update-Database -Script generates SQL without semicolon,我想知道EF核心实现

1 个答案:

答案 0 :(得分:0)

EF核心实现类似,但在覆盖Generate方法上有所不同,这是CustomMySqlMigrationSqlGenerator的实现:

using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Metadata;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Migrations.Operations;
using Microsoft.EntityFrameworkCore.Storage;
namespace test
{
/// <summary>
/// Custom MigrationSqlGenerator to add semi-colons to the end of 
/// all migration statements.
/// </summary>
public class CustomMySqlMigrationSqlGenerator : MySqlMigrationsSqlGenerator
{
    private readonly MigrationsSqlGeneratorDependencies _dependencies;

    public CustomMySqlMigrationSqlGenerator(MigrationsSqlGeneratorDependencies dependencies, 
        IMigrationsAnnotationProvider migrationsAnnotations, 
        IMySqlOptions options): base(dependencies, migrationsAnnotations, options)
    {
        _dependencies = dependencies;
    }

    public override IReadOnlyList<MigrationCommand> Generate(IReadOnlyList<MigrationOperation> operations, IModel model = null)
    {
        List<MigrationCommand> result = new List<MigrationCommand>();
        IEnumerable<MigrationCommand> statements = base.Generate(operations, model);
        foreach (MigrationCommand statement in statements)
        {
            var factory = _dependencies.CommandBuilderFactory.Create();
            factory.Append((statement.CommandText.TrimEnd() + ";").Replace(";;", ";"));
            result.Add(new MigrationCommand(factory.Build(), statement.TransactionSuppressed));
        }
        return result;
    }
  }
}

还需要在DbContext中设置配置:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.ReplaceService<IMigrationsSqlGenerator, CustomMySqlMigrationSqlGenerator>();
    }