Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 737
smerlung Avatar asked Jan 08 '14 09:01

smerlung


1 Answers

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>
like image 81
user2458323 Avatar answered Nov 21 '22 09:11

user2458323