使用EntityFramework之Code First開發與MySql數據庫問題一例


   在最近的項目中,打算使用EntityFramework與MySql數據庫來配合,不想卻出現了一些無可奈何的問題。 開發環境如下:

EntityFramework 版本:4.3.1

 .Net Framework 版本:4.0

               MySql 版本:5.5  

   Connector/Net 版本:6.5.4

 

 示范代碼比較簡單,創建一個控制台應用項目:

public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}

public class Blog : DbContext
{
public IDbSet<Post> Posts { get; set; }
}

static void Main(string[] args)
{
using (var blog = new Blog())
{
var post = new Post()
{
Title = "Test Title",
Content = "This is my content for test"
};
blog.Posts.Add(post);
blog.SaveChanges();
}
}

app.config的配置是這樣

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="Blog" connectionString="server=localhost;User Id=root;Pwd=password;Persist Security Info=True;database=Blog" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
</configuration>

 

原本在SqlServer下是能正常執行的,但是換作MySql之后,在首次運行時,會拋出一個異常,內容如下:

 

Exception:  MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax;

check the manual that corresponds to your MySQL server version for the right syntax to use near

         'NOT NULL,

         `ProductVersion` mediumtext NOT NULL);  

ALTER TABLE `HistoryRow` ' at line 6

 

從內容上猜測,是與EF4.3.1的新特性有關的問題,新版本增加了一個CodeFirst Migrations功能,在初始化數據庫的過程中會創建一張MigrationHistory表到數據庫中,於是我嘗試捕捉相關的sql腳本,具體如下:

CREATE TABLE `__MigrationHistory`(
`MigrationId` mediumtext NOT NULL,
`CreatedOn` datetime NOT NULL,
`Model` varbinary NOT NULL,
`ProductVersion` mediumtext NOT NULL);


 這段腳本放置在MySql命令行去執行,也是相同的異常信息。仔細查看錯誤提示,發現varbinary這個類型出了問題,在MySql中居然不能正確識別,反而修改成varbinary(1)才可以通過,也就是要求此類型必須要給定長度。可是,這明顯是EF自動生成的,無從修改啊。 因此查看MSDN的官方文檔,找到有關CodeFirst Migrations的配置類,如果不需要自動生成的話,是可以通過配置類DbMigrationsConfiguration的AutomaticMigrationsEnabled屬性來設置禁用的,我按幫助上的示例寫了相關的代碼繼承了此類,可惜仍然沒有效果,可能是哪里沒有設置正確。當然,我想更多情況應該還是期望使用這個Migration功能的,只是不知道EF是否提供接口,由開發者自己去實現自動生成腳本?暫時未找到答案。所以,為了能順利使用CodeFirst和MySql的組合,只好避開這個問題,將EF版本降到4.1.10715,然后一切都可以正常運行了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM