使用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,然后一切都可以正常运行了。

 

posted on 2012-03-09 18:50  Bean.Hsiang  阅读(3368)  评论(11编辑  收藏  举报