![](/img/trans.png)
[英]AlterProcedureException when I try update-database command EF6 MYSQL
[英]EF6 MySql: Update-Database -Script generates SQL without semicolon
将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());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.