MySql Connector EF6

8
作为一个EF新手,我正在尝试在我安装在开发电脑上的MySql Server 5.6中使用Entity Framework 6 Code First。 我创建了一个非常小的测试控制台项目并添加了以下NuGet包:
  1. EntityFramework 6.0.2
  2. MySql.Data
  3. MySql.Data.Entities.EF6
我的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 have two classes:

MyContext:

public class MyContext : DbContext
{
    public MyContext(DbConnection connection)
        : base(connection, true)
    {
    }

    public DbSet<MyEntity> MyEntities { get; set; }
}

我的实体:

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:

Entity Framework提供程序类型'MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data,Version=6.8.3.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d'的'Instance'成员没有返回继承自'System.Data.Entity.Core.Common.DbProviderServices'的对象。

我做错了什么?

编辑

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

然后我直接从MySql官网安装了新版本,并且现在上述测试代码可以成功运行?


由于某些原因,MySQL Nuget包并不总是有效(v8.0.15),但从MySQL网站安装.NET连接器msi可以解决此问题。 可能NuGet包缺少一些必需的DLL或其他内容,而错误消息并不有用。令人沮丧。 - Zar Shardan
4个回答

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>

这不会改变我的代码。我已经编辑了我的帖子,说明了我是如何解决这个问题的。 - smerlung

2

我也在使用EF6.1时遇到了这个错误:

无法确定类型为“MySql.Data.MySqlClient.MySqlClientFactory”的提供程序工厂的提供程序名称。请确保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>

错误已经消失。

又遇到了这个问题,现在是8.0.15.0 -> 8.0.16.0更新。 - Zar Shardan

0

我遇到了完全相同的问题。 通过使用以下 NuGet 包,成功解决了它:

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

0

我遇到了这个异常,但我的规格是EF6.2 My Sql Connector和EF extender v8.0.13.0,但看起来一样。我有类似的连接/数据库上下文策略,因为我们在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包含这些设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接