【问题标题】:EF6 MySql: Update-Database -Script generates SQL without semicolonEF6 MySql:Update-Database -Script 生成不带分号的 SQL
【发布时间】:2015-06-11 13:09:17
【问题描述】:

在将 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 做所有或不做任何事情?

谢谢。

【问题讨论】:

    标签: mysql entity-framework


    【解决方案1】:

    您可以通过如下扩展 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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2013-11-09
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多