Entity Framework 5.0 code-première avec MySQL Connector 6.6.5.0 .Net 4.5

Pour la vie de moi, je ne peux pas obtenir mon C# WinApp de travailler avec Entity Framework 5.0 avec une base de données de MySql utilisation de MySql connector 6.6.5.0 (MySql.Data de référence) et MySql Entité 6.5.4.0 (MySql.Data.Entity de référence). À l'aide de .Net Framework 4.5 sur Visual Studio 2012. Au moment d'écrire ces lignes, les versions ci-dessus sont toutes les dernières stables.

Voici ce que j'ai sur l'app.config

<?xml version="1.0" encoding="utf-8"?>
<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=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.data>
    <DbProviderFactories>
      <add name="MySQL Data Provider" 
           invariant="MySql.Data.MySqlClient" 
           description=".Net Framework Data Provider for MySQL" 
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="MyConnectionName" 
         connectionString="Server=mysql13.myserver.com.br;Database=mydb;User Id=username;Pwd=pa$$w0rd;" 
         providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data">
    </defaultConnectionFactory>
  </entityFramework>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.6.5.0" newVersion="6.6.5.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Dans le code

De l'utilisateur de la classe

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<Permission> Permissions { get; set; }

    public User()
    {
        Permissions = new List<Permission>();
    }
}

public class Permission
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class UserContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Permission> Permissions { get; set; }
}

La création d'un nouvel enregistrement

        using (var db = new UserContext())
        {
            Permission permission1 = new Permission() { Name = "Permission 1", Description = "The desc 1" };
            Permission permission2 = new Permission() { Name = "2nd Perm", Description = "Desc2" };
            User user = new User() { Name = "Joao" };
            user.Permissions.Add(permission1);
            user.Permissions.Add(permission2);

            db.Users.Add(user);
            db.SaveChanges();
        }

Et je reçois l'exception à la ligne db.Users.Add(user);

System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=Failed to set Database.DefaultConnectionFactory to an instance of the 'MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data' type as specified in the application configuration. See inner exception for details.
  Source=EntityFramework
  StackTrace:
       at System.Data.Entity.Internal.AppConfig.<.ctor>b__1()
       at System.Lazy`1.CreateValue()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Lazy`1.get_Value()
       at System.Data.Entity.Internal.AppConfig.get_DefaultConnectionFactory()
       [removing the rest of the stack]
  InnerException: System.InvalidCastException
       HResult=-2147467262
       Message=Unable to cast object of type 'MySql.Data.MySqlClient.MySqlClientFactory' to type 'System.Data.Entity.Infrastructure.IDbConnectionFactory'.
       Source=EntityFramework
       StackTrace:
            at System.Data.Entity.Internal.AppConfig.<.ctor>b__1()
       InnerException: 

J'ai essayé plusieurs choses, y compris l'ajout de Culture=neutral, PublicKeyToken=c5687fc88969c44d dans le DbProviderFactories section en vain..

J'ai ajouté de l'Entity Framework, MySql Connecteur de Données et MySql.Les données.Entité à l'aide de Gestionnaire de Package NuGet.

J'ai vu bien d'autres postes avec un problème similaire, mais ne peut pas trouver une solution claire, surtout avec la gestion des versions combo EF 5 + MySql Connector 6.6.5.0.

Quelqu'un a fait ce travail? Vous pouvez poster à la fois l'application.config ET le code pour le faire fonctionner?

Renommer votre chaîne de connexion pour être le même que celui de votre classe DbContext. PS, Mon conseil personnel. Ne pas utiliser MySQL avec EF. La mise en œuvre est cassé.
Oh, et supprimer le EntityFramework section.
Merci Aron, je vais donner un coup de cette. Et vous pensez que la mise en œuvre est brisé en fonction de votre expérience? Je pense à mon application va avoir au plus simple des requêtes de jointure, rien de trop compliqué.. pense toujours que c'est mieux si je n'ai pas utilisé EF avec MySql?
Même "pas très compliqué" requêtes que j'ai trouvé pour produire des résultats inattendus. Le pire de ce qui est l'endroit où il produit SELECT * FROM (SELECT * FROM foo) ORDER BY BAR. Qui MySQL ne permet pas d'optimiser la requête (à tous) correctement.
Si vous avez besoin d'EF je vous conseille tout de la base de données qui n'est pas MySQL ou SQLite.

OriginalL'auteur Joao Coelho | 2013-05-07