smerlung
smerlung

Reputation: 1519

MySql Connector EF6

As a EF noob I am trying to use Entity Framework 6 Code First with a MySql Server 5.6 which I installed on my development computer.

I have made a very small test console project. I have added the NuGet packages:

  1. EntityFramework 6.0.2
  2. MySql.Data
  3. MySql.Data.Entities.EF6

My App.config looks like this:

<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; }
}

MyEntity:

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

    public string Name { get; set; }
}

My main method looks like this:

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();
        }
    }
}

When I run it I get a System.NotSupportedException:

Unable to determine the provider name for provider factory of type 'MySql.Data.MySqlClient.MySqlClientFactory'. Make sure that the ADO.NET provider is installed or registered in the application config

I tried to add MySql.Data.MySqlClient.MySqlClientFactory to the App.config:

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

But then I arrive at the Entity.Core Bug:

The 'Instance' member of the Entity Framework provider type 'MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' did not return an object that inherits from 'System.Data.Entity.Core.Common.DbProviderServices'.

What am I doing wrong?

EDIT

I tried removing the NuGet Packages (MySql.Data and MySql.Data.Entities.EF6)

Then I installed the new version directly from MySql and now the above test code runs successfully?

Upvotes: 8

Views: 16650

Answers (4)

T.S.
T.S.

Reputation: 19330

I had this exception but my specs were EF6.2 My Sql Connector and EF extender v8.0.13.0 But it looks same. I have similar connection/dbcontext strategy because we're switching between ORA, Sql Serv and MySql. I added following sections to end point config files and it started to work

<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>

Note, if you have layered app and you have EF referenced in your low layer, when you add a package, it will add these entries into app.config. But your DLL is not the end point, so you need to manually propagate these settings into your web.config (if your end point is web app). Or, you can add same package to your end point. This depends on your architecture. In my case, we trying not to add packages when they are not needed. But if you use features of EF directly in calling assemblies, you would require reference EF anyways. Main thing here - make sure end point *.config contains these settings

Upvotes: 0

user2458323
user2458323

Reputation: 81

you must keep both config sections, like this

  <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>

Upvotes: 7

Zar Shardan
Zar Shardan

Reputation: 5931

I was also getting this error with EF6.1:

Unable to determine the provider name for provider factory of type 'MySql.Data.MySqlClient.MySqlClientFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.

Turned out it was because of the binding redirect referencing an older version of MySQL.Data (6.7.4) which does not support EF6. After I changed it to:

<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>

The error was gone.

Upvotes: 2

Diana Ionita
Diana Ionita

Reputation: 3318

I ran into the exact same issue. Managed to fix it by using the following NuGet Packages:

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

Upvotes: 0

Related Questions