草庐IT

mysql - EF6 MySQL : Update-Database -Script generates SQL without semicolon

coder 2023-10-03 原文

在将 EF6 与 MySql 结合使用时,我遇到以下不安情况:每次创建新迁移时,我都会使用以下方法将更改应用到我的开发环境

     Update-Database

但是当我想为我的其他环境生成 SQL 脚本时(并保持在源代码控制中)我使用

     Update-Database -Script

生成的 SQL 是这样的:

CREATE TABLE `AddressType` (`Id` NVARCHAR(10)  NOT NULL ,`Description` NVARCHAR(30)  NOT NULL ,PRIMARY KEY ( `Id`) ) ENGINE=INNODB AUTO_INCREMENT=0
CREATE TABLE `Bank` (`Id` INT NOT NULL ,`CNPJ` BIGINT NOT NULL ,`Name` NVARCHAR(100) ,`WebSite` NVARCHAR(500) ,PRIMARY KEY ( `Id`) ) ENGINE=INNODB AUTO_INCREMENT=0

当我尝试在 SQLyog 上运行生成的脚本并运行它时,我收到一条错误消息,提示我的脚本语法无效。我相信这是因为 EF 只在它的末尾添加了一个分号,因为它在我手动添加分号时运行。我在添加分号时遇到的一个问题是,如果脚本由于某种原因失败,数据库处于不一致状态,这意味着迁移系统将继续失败,因为表/列已经存在。

是否有任何设置可以在每条语句后自动添加分号?有什么方法可以让 MySql 在运行我的脚本/迁移时做全部或不做?

谢谢。

最佳答案

您可以通过如下扩展 MySqlMigrationSqlGenerator 来完成此操作:

/// <summary>
/// Custom MigrationSqlGenerator to add semi-colons to the end of 
/// all migration statements.
/// </summary>
public class CustomMySqlMigrationSqlGenerator : MySqlMigrationSqlGenerator {
    public override IEnumerable<MigrationStatement> Generate(IEnumerable<MigrationOperation> migrationOperations, string providerManifestToken) {
        IEnumerable<MigrationStatement> statements = base.Generate(migrationOperations, providerManifestToken);
        foreach (MigrationStatement statement in statements) {
            if (!statement.Sql.EndsWith(";")) {
                statement.Sql = statement.Sql.TrimEnd() + ";";
            }
        }
        return statements;
    }
}

并在 Configuration.cs 中启用它:

public Configuration() {
    AutomaticMigrationsEnabled = false;
    SetSqlGenerator("MySql.Data.MySqlClient", new CustomMySqlMigrationSqlGenerator());
}

关于mysql - EF6 MySQL : Update-Database -Script generates SQL without semicolon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30781748/

有关mysql - EF6 MySQL : Update-Database -Script generates SQL without semicolon的更多相关文章

随机推荐