MySql连接器EF6

时间:2014-01-08 09:48:13

标签: mysql entity-framework

作为EF noob,我试图将Entity Framework 6 Code First与我在开发计算机上安装的MySql Server 5.6一起使用。

我做了一个非常小的测试控制台项目。我添加了NuGet包:

  1. EntityFramework 6.0.2
  2. MySql.Data
  3. MySql.Data.Entities.EF6
  4. 我的App.config看起来像这样:

    <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <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"></provider>
        </providers>
    </entityFramework>
    

    A有两个类:

    MyContext:

    public class MyContext : DbContext
    {
        public MyContext(DbConnection connection)
            : base(connection, true)
        {
        }
    
        public DbSet<MyEntity> MyEntities { get; set; }
    }
    

    myEntity所:

    public class MyEntity
    {
        [Key]
        public int Id { get; set; }
    
        public string Name { get; set; }
    }
    

    我的主要方法如下:

    static void Main(string[] args)
    {
        using (MySqlConnection conn = new MySqlConnection("Server=127.0.0.1;Database=calibrationtest;Uid=calibration;Pwd=*******"))
        {
            using (MyContext context = new MyContext(conn))
            {
                context.MyEntities.Add(new MyEntity()
                {
                    Name = "1234"
                });
    
                context.SaveChanges();
            }
        }
    }
    

    当我运行它时,我得到一个System.NotSupportedException:

      

    无法确定类型的提供程序工厂的提供程序名称       'MySql.Data.MySqlClient.MySqlClientFactory'。确保       ADO.NET提供程序已在应用程序配置

    中安装或注册

    我尝试将MySql.Data.MySqlClient.MySqlClientFactory添加到App.config中:

    <provider invariantName="MySql.Data.MySqlClient.MySqlClientFactory" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data"></provider>
    

    然后我到达了Entity.Core Bug:

      

    实体框架提供程序类型的“实例”成员       'MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data,Version = 6.8.3.0,       Culture = neutral,PublicKeyToken = c5687fc88969c44d'没有返回一个对象       继承自'System.Data.Entity.Core.Common.DbProviderServices'。

    我做错了什么?

    修改

    我尝试删除NuGet包(MySql.Data和MySql.Data.Entities.EF6)

    然后我安装了新版本directly from MySql,现在上面的测试代码成功运行了吗?

4 个答案:

答案 0 :(得分:7)

你必须保留两个配置部分, 像这样

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

  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite"     type="System.Data.SQLite.SQLiteProviderServices, System.Data.SQLite.Linq, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"></provider>      
    </providers>
  </entityFramework>

答案 1 :(得分:2)

我也在使用EF6.1收到此错误:

  

无法确定类型为&#39; MySql.Data.MySqlClient.MySqlClientFactory&#39;的提供程序工厂的提供程序名称。确保在应用程序配置中安装或注册了ADO.NET提供程序。

原来是因为绑定重定向引用了不支持EF6的旧版MySQL.Data(6.7.4)。我把它改成后:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.8.3.0" newVersion="6.8.3.0" />
  </dependentAssembly>
</assemblyBinding>

错误消失了。

答案 2 :(得分:0)

我遇到了完全相同的问题。 通过使用以下NuGet包管理以修复它:

EntityFramework 6.1.0
MySql.ConnectorNET.Data 6.8.3.2
MySql.ConnectorNET.Entity 6.8.3.2

答案 3 :(得分:0)

我有这个异常,但是我的规格是EF6.2 My Sql Connector和EF Extender v8.0.13.0,但看起来却一样。我有类似的连接/ dbcontext策略,因为我们在ORA,Sql Serv和MySql之间切换。我在端点配置文件中添加了以下部分,它开始起作用

<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" />
    <!-- ADDED THIS (below) -->
    <provider invariantName="MySql.Data.MySqlClient" 
              type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.0.13.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
  </providers>
</entityFramework>

<runtime>     
  <assemblyBinding>
    <!-- ADDED THIS (below) -->
    <dependentAssembly>
      <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-8.0.13.0" newVersion="8.0.13.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

请注意,如果您已对应用程序进行了分层,并且在较低层中引用了EF,则在添加软件包时,它将把这些条目添加到app.config中。但是DLL并不是终点,因此您需要将这些设置手动传播到web.config中(如果终点是Web应用程序)。或者,您可以将同一包添加到终点。这取决于您的体系结构。就我而言,我们试图在不需要时不添加软件包。但是,如果直接在调用程序集中使用EF的功能,则无论如何都需要引用EF。这里的主要内容-确保端点*.config包含这些设置