最近又在忙乎做个内部系统,需要连接至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,更多功能暂时没有测试,不知道会不会出现啥问题。