文章分类
  • 5月
    21日
    使用EntityFramework连接MySQL数据库
    .NET编程 dier 2014-05-21 09:58 7772 0

    最近又在忙乎做个内部系统,需要连接至OA的数据库去同步一些用户数据,而OA的数据库是MySQL的,以及还真没用EF连接过MySQL,所以正好学习了一下。

    度娘了一下相关的资料,还好,有这么几篇说到这事了,不用瞎扯,按照步骤来处理,顺利的连上了。在这里大概总结了一下连接MySQL数据库的步骤。


    1.利用NuGet下载相关的包

    在项目-引用节点右键,管理NuGet程序包。然后NuGet窗口上搜索“MySQL”,找到“MySQL.Data”和“MySQL.Data.Entity”两个程序包,分别安装。(如果没有EF,自行下载)


    2.增加EF初始化配置

    <configSections>
      <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </configSections>

    这个配置章节在你项目使用EF时肯定会有,如果已经有就忽略掉。


    3.配置数据库工厂提供程序

    <system.data>
      <DbProviderFactories>
        <remove invariant="MySql.Data.MySqlClient"/>
        <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data" />
      </DbProviderFactories>
    </system.data>

    在配置文件中的<configuration>节点下新增一个节点,初始化数据库工厂提供程序,如果不添加则会报找不到提供程序。


    4.配置EF提供程序

    <entityFramework>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="v11.0" />
        </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"  />
      </providers>
    </entityFramework>

    找到<entityFramework>节点,增加一个<provider>节点,告诉EF连接MySql.Data.MySqlClient对应的程序包。这里需要注明的是,我的项目使用和MsSQL和MySQL,所以才有两个<provider>。


    5.配置连接字符串

    <connectionStrings>
      <add name="SysDB" providerName="System.Data.SqlClient" connectionString="server=host;database=SysDB;uid=sa;pwd=123456" />
      <add name="EoaDB" providerName="MySql.Data.MySqlClient" connectionString="datasource=host;database=OaDB;uid=root;pwd=root;" />
    </connectionStrings>

    这里同样,我配置了两个连接字符串,分别对应MsSQL和MySQL的两个数据库,注意它们的providerName属性不同。


    6.写DbContext类

    public class EOAContext : DbContext
    {
        public EOAContext() : base("name=EoaDB") { }
    }

    这个其实就没啥好说了,继承DbContext,然后原来EF怎么写就怎么写,这里的连接字符串的名称修改了,所以写了个构造函数来指定连接字符串的name。


    好了,至此就可以让EF连接MySQL了。

    顺便说一下,网上有提到一些旧版本的MySQL.Data.Entity需要自己建__MigrationHistory表,不过我这个是最新的版本(6.8.3),应该是解决了这问题,所以暂时没发现需要写相应的代码。而且我只是去Select,更多功能暂时没有测试,不知道会不会出现啥问题。


文章评论