zoukankan      html  css  js  c++  java
  • 使用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,然后一切都可以正常运行了。

  • 相关阅读:
    SQLite在php中的接口
    Smarty3——内置函数
    Smarty3——foreach
    Smarty3——复合变量修饰器输
    Smarty3——从配置文件获取的变量
    Smarty3——变量修饰器
    Git命令
    容器云----docker-registry+docker-registry-web(镜像仓库+镜像仓库管理界面)
    容器云----kubernetes-dashboard(kubernetes管理界面)
    容器云----kubernetes+docker-ce
  • 原文地址:https://www.cnblogs.com/BeanHsiang/p/2388177.html
Copyright © 2011-2022 走看看