EntityFramework(EF)连接MySql数据库详解

做.Net开发的童鞋想必都知道平时做开发用的比较多的数据库是SqlServer,EF作为非常流行的ORM框架,用它来操作数据库给我们带来了极大的方便,但是我们如何通过EF来连接MySql数据库呢,毕竟MySql是免费的嘛,今天我主要讲解下如何通过EF连接MySql数据库以及踩过的一个小坑,我们从具体的例子入手,方便大家快速掌握。

1、首先,打开vs2017,然后新建一个MVC项目(当然你可以创建你喜欢的项目类型,在这里我以MVC项目为例来讲解)

2、项目创建完成后,右击 引用->管理NuGet程序包,打开NuGet包管理器,然后输入mysql,添加如下程序集引用到项目中

3、添加完引用后vs会帮我们在web.config里自动生成EF的配置信息如下,注意需要手动给entityFramework节点添加属性codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6"

<configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, 
             EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices,
                EntityFramework.SqlServer" /> 
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices,
                MySql.Data.Entity.EF6, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
</entityFramework>

4、下面我们新建一个实体 Post,这个实体到时候会映射到数据库中的表

public class Post
{
    public int Id { get; set; }
    public string Name { get; set; }
}

5、新建数据库上下文类,该类继承自EF的DbContext类

public class EFMySqlDbContext:DbContext
{
    public virtual DbSet<Post> Posts { get; set; }
}

6、接下来我们需要在web.config里配置数据库链接字符串,name属性的值必须和我们新建的数据库上下文类的名称(EFMySqlDbContext)相同,当然你也可以指定别的名称,只需要在EFMySqlDbContext类添加一个无参构造函数,并且调用父类的构造函数并传入链接字符串的name(例如:name=MyDbcontext),然后修改配置文件中的链接字符串属性name的值为你自定义的名称即可,最后要注意providerName属性的值。

<connectionStrings>
    <add name="EFMySqlDbContext" connectionString="data source=localhost;initial catalog=EFMySqlDemo;
         User ID=root;Password=123456;integrated security=True" providerName="MySql.Data.MySqlClient" />
</connectionStrings>

7、最后我们新建一个控制器,主要是用来访问数据库上下文类来让EF自动帮我们生成数据库

public class DemoController : Controller
{
    public ActionResult Index()
    {
        using (var dbContext=new EFMySqlDbContext())
        {
 
            var posts = dbContext.Posts.ToList();
        }
        return View();
    }
}

哈哈!貌似快要大功告成,启动调试,打开网址 http://localhost:9723/Demo后,我发现程序在运行时报了如下错误:

"MySql.Data.MySqIClient.MySqlProviderSevices”违反了继承安全 性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安 全可访问性低。 "

经过苦苦的挖掘,最后发现是MySql.Data.Entity的版本问题,我安装的版本是6.10.5

解决办法如下:

打卡NuGet管理控制器,选择版本为6.9.10,点击安装,生成一下项目,然后打开刚才的调试地址,此时打开MySql管理工具,发现EF已经成功的为我们生成了efmysqldemo数据库。

当然,如果你的版本没有问题的话,在最后一步就会成功生成数据库!

最后我再补充一个重点(请拿出笔和本记录一下,这个是考试重点!哈哈!),在启用EF自动迁移后,最后一步执行“update-database”可能会报“给定关键字不在字典中。”或者其他一些错误,解决办法如下:

在数据库链接字符串的配置里,给connectionString这个属性的值后面添加“persistsecurityinfo=True;allowzerodatetime=True;convertzerodatetime=True”,这样就可以成功迁移了。

如果你用的是EF的DbFirst开发模式,那么你还需要执行以下操作:

1、运行services.msc,重启MySQL服务。

2、在MySQL运行以下命令: use mydbname(你的数据库名称); set global optimizer_switch='derived_merge=OFF'。

3、重新生成 *.edmx。

发表评论