之前编写有关数据库的项目时,都是通过ADO.NET使用原始的SQL语句进行数据的读写的,个人觉得这种方式对数据的操作更能够“随心所欲”,而且很容易切换不同的数据库,所以对Entity Framework不感兴趣。近期看了以下EF相关的东西,发现之前写的所有内容都能够使用EF,而且更简单、快捷,甚至根本不用去百度一些很复杂的SQL语句了,所以在现在的一个测试项目中,果断的采用了Visual Studio 2012以及Entity Framework、MySQL的方式,果然节省很多时间。

由于Visual Studio以及Entity Framework本身和SQLServer结合的就很好,所以很容易搭建一个开发和运行环境,但是如果要使用其他类型的数据库,如MySQL,就需要简单的配置一下,下面是我个人总结的一些经验。

首先,需要在Visual Studio的项目上使用NuGet管理依赖的程序包,搜索MySQL,如下图所示:

wKiom1S0xBDxPE_uAARGhlIDmYE770.jpg

在搜索到的结果中,选择“MySql.Data.Entity”并安装,在这个过程中,它同样会安装依赖的“MySql.Data”库相关的文件。安装成功后,在项目的引用节点中会出现MySql相关的文件,如下图所示:

wKioL1S0xU6TQexlAADddRCqps4015.jpg

如果项目时Windows Class Library类型,那么在项目的App.config文件中,会自动添加以下配置:

<configuration>
  <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>
    <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.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
      </provider></providers>
  </entityFramework>
<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, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data></configuration>

其中添加了EntityFramework的Provider,并加Provider工厂设置为MySql的提供程序。如果是Web工程,如MVC,则会在Web.config文件中增加如下配置:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v12.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, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
      </provider></providers>
  </entityFramework>
<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, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

以上内容都是通过NuGet管理依赖包得到的,我使用的Code First的方式,在定义了自己的DbContext后以为就可以使用了,结果程序还是使用SQLServer的提供程序,于是百度了很多解决方法,大多都是以上内容。后来在MySql的官网上搜索了一下Entity Framework,发现在定义DbContext的实现时,需要加入DbConfigurationType属性来指明使用哪一个配置,如下所示:

    [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]

    class SimpleDbContext : DbContext

    {

        public SimpleDbContext(string connectionString)

            : base(connectionString)

        {

            

        }

    }

之后就一切正常了。需要注意的是,虽然MySql能够很好的支持Entity Framework,但是毕竟不是.Net原生支持的,需要研究的地方还很多。