2015-06-11 3 views
5

Я имею следующую непростую ситуацию при использовании Ef6 с MySql: каждый раз, когда я создаю новые миграции я вносящие изменения в мою среду разработки с использованиемEF6 MySql: Update-Database -script генерирует SQL без запятой

 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 делать все или ничего при запуске моих скриптов/миграций?

Спасибо.

ответ

2

Вы можете сделать это путем расширения 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()); 
} 
Смежные вопросы