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