Même application, différentes bases de données: Entity framework 6.X + MySQL + SQL Server

Hier, j'ai fait la migration (EF 5.0 => EF 6.0) de l'application web qui utilise entity framework pour atteindre MySql et SQL Server bases de données (notamment DbContext de bases de données particulier, PAS tout DbContext à tout type de base de données).

Moment de la compilation, les choses ont été faites sans aucun problème, exécutez-le temps m'a confronté avec l'exception:

La valeur par défaut DbConfiguration instance a été utilisé par l'Entité Cadre avant le "MySqlEFConfiguration" type a été découvert.

La [DbConfigurationType(typeof(MySqlEFConfiguration))] l'attribut dans le contexte semble avoir été ignoré au moment de l'exécution, car le contexte est dans un assembly externe(?) et le DbConfiguration utilisé à la place est global pour le domaine d'application, non spécifiques au contexte(?)."

J'ai essayé différentes approches pour la fixer, puis googlé et - surprise - pas trouver de solution de travail.

Ressemble à la situation décrite bien formé ici http://forums.mysql.com/read.php?174,614148,614148 toujours pas changé, ou j'ai raté quelques choses évidentes.

Tout les commentaires seront appréciés.

Vous en remercie d'avance!

DESCRIPTION DÉTAILLÉE:

D'entrée (simplifié):
- ASP.NET Application Web

  • Couche d'accès aux données mis en œuvre sur Entity Framework 6.1.1
  • Entity Framework fournisseurs:
    • Système.Les données.SqlClient 6.1.1
    • MySql.Les données.MySqlClient 6.9.4
  • MY_SqlContext, modèle premier concept, ciblée à MA base de données SQL Server
  • Ms_SqlContext, la première base de données concept, ciblé pour MS SQL Server base de données

Selon la documentation générique de l'Entity Framework 6 et MySql Connector/Net de la documentation
(http://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html),
MY_SqlContext nécessite MySqlEFConfiguration à être appliquée.

Selon les deux documentations, référencé ci-dessus, il existe trois options pour ce faire.
Tous les trois été essayé et échoué.

Option 1: Ajout de la DbConfigurationTypeAttribute [DbConfigurationType(typeof(MySqlEFConfiguration))] à MY_SqlContext classe

Web Approprié.config segments:

<connectionStrings>
    <add name="MY_SqlContext"
         connectionString="server=.;User Id=root;password=...;Persist Security Info=True;database=MySqlDb;Use Compression=False;Use Old Syntax=False"
         providerName="MySql.Data.MySqlClient" />
    <add name="Ms_SqlContext"
         connectionString="metadata=res://*/Ms_SqlContext.csdl|res://*/Ms_SqlContext.ssdl|res://*/Ms_SqlContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...&quot;"
         providerName="System.Data.EntityClient" />
</connectionStrings>

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
        <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices,  MySql.Data.Entity.EF6" />
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
</entityFramework>

Après l'application démarre et web demandes de commencer le traitement:

Ms_SqlContext fonctionne très bien mais en essayant de créer un MY_SqlContext exemple, j'obtiens l'exception:

La valeur par défaut DbConfiguration instance a été utilisé par l'Entité Cadre avant le "MySqlEFConfiguration" type a été découvert. Une instance de "MySqlEFConfiguration" doit être réglé au démarrage de l'application avant d'utiliser toute Entité Cadre de fonctionnalités, ou doit être enregistrée dans le fichier de configuration de l'application. Voir ...LinkId=260883 pour plus d'informations."

Option 2: Appel DbConfiguration.SetConfiguration(nouveau MySqlEFConfiguration()) au démarrage de l'application

Web Approprié.config segments (de même que pour l'Option 1, en fait):

<connectionStrings>
    <add name="MY_SqlContext"
         connectionString="server=.;User Id=root;password=...;Persist Security Info=True;database=MySqlDb;Use Compression=False;Use Old Syntax=False"
         providerName="MySql.Data.MySqlClient" />
    <add name="Ms_SqlContext"
         connectionString="metadata=res://*/Ms_SqlContext.csdl|res://*/Ms_SqlContext.ssdl|res://*/Ms_SqlContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...&quot;"
         providerName="System.Data.EntityClient" />
</connectionStrings>

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
        <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices,  MySql.Data.Entity.EF6" />
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
</entityFramework>

Code, ajouté Mondiale.asax.cs:
private void Application_Start(object sender, EventArgs e)
{
DbConfiguration.SetConfiguration(nouveau MySqlEFConfiguration());
...

Après l'application démarre et web demandes de commencer le traitement pour essayer de créer un Ms_SqlContext exemple, j'obtiens l'exception:

Une instance de "MySqlEFConfiguration" a été définie, mais ce type n'a été découvert dans la même assemblée que les 'Ms_SqlContext contexte. Soit mettre le DbConfiguration type dans la même assemblée que les DbContext type, l'utilisation DbConfigurationTypeAttribute sur le DbContext type pour spécifier le DbConfiguration type, ou de définir la DbConfiguration type dans le fichier de configuration. Voir ...?LinkId=260883 pour plus d'informations.

Option 3: Définir la DbConfiguration type dans le fichier de configuration

Web Approprié.config segments

<connectionStrings>
    <add name="MY_SqlContext"
         connectionString="server=.;User Id=root;password=...;Persist Security Info=True;database=MySqlDb;Use Compression=False;Use Old Syntax=False"
         providerName="MySql.Data.MySqlClient" />
    <add name="Ms_SqlContext"
         connectionString="metadata=res://*/Ms_SqlContext.csdl|res://*/Ms_SqlContext.ssdl|res://*/Ms_SqlContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...&quot;"
         providerName="System.Data.EntityClient" />
</connectionStrings>

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
        <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices,  MySql.Data.Entity.EF6" />
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
</entityFramework>

Après l'application démarre et web demandes de commencer le traitement:
...
Ms_SqlContext instance est créée, mais lors de la première exécution de la requête, j'obtiens l'exception:

EntityException: {"Le fournisseur sous-jacent échoué sur Ouvrir."}

InnerException: {"Impossible de se connecter à l'un des spécifié MySQL hôtes."}

Donc, Ms_SqlContext obtenir la configuration de MySql qui est évidemment faux.

source d'informationauteur Artem Ozornin