2015-06-11 29 views
5

Tôi gặp tình trạng không thoải mái sau khi sử dụng EF6 với MySql: mỗi khi tôi tạo ra một cuộc di cư mới tôi áp dụng những thay đổi môi trường phát triển của tôi sử dụngEF6 MySql: Cập nhật cơ sở dữ liệu--Script tạo SQL mà không cần dấu chấm phẩy

 Update-Database 

nhưng khi tôi muốn tạo ra kịch bản SQL cho các môi trường khác của tôi (và thường xuyên kiểm soát nguồn) tôi sử dụng

 Update-Database -Script 

và SQL được tạo ra là một cái gì đó như thế này:

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 

Khi tôi thử chạy tập lệnh được tạo trên SQLyog và chạy nó, tôi nhận được thông báo lỗi rằng tập lệnh của tôi có cú pháp không hợp lệ. Tôi tin rằng điều này là bởi vì EF chỉ thêm một dấu chấm phẩy vào cuối của nó, vì nó chạy khi tôi thêm dấu chấm phẩy bằng tay. Một vấn đề tôi có khi tôi thêm dấu chấm phẩy là nếu kịch bản thất bại vì lý do nào đó cơ sở dữ liệu ở trạng thái không nhất quán, có nghĩa là hệ thống di chuyển sẽ thất bại vì bảng/cột đã tồn tại.

Có bất kỳ cài đặt nào tự động thêm dấu chấm phẩy sau mỗi câu lệnh không? Có cách nào tôi có thể yêu cầu MySql để làm tất cả hoặc không có gì khi chạy kịch bản của tôi/di cư?

Cảm ơn.

Trả lời

2

Bạn có thể thực hiện điều này bằng cách mở rộng MySqlMigrationSqlGenerator như sau:

/// <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; 
    } 
} 

Và kích hoạt nó trong Configuration.cs:

public Configuration() { 
    AutomaticMigrationsEnabled = false; 
    SetSqlGenerator("MySql.Data.MySqlClient", new CustomMySqlMigrationSqlGenerator()); 
} 
Các vấn đề liên quan