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="data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...""
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="data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...""
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="data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...""
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
Vous devez vous connecter pour publier un commentaire.
Donc, la solution finale est:
Créer propre DbConfiguration successeur de black jack et des putes:
Marque Ms_SqlContext avec MultipleDbConfiguration (et ne rien faire d'autre avec ce genre de DbContext)
Marque Ms_SqlContext avec MultipleDbConfiguration, et d'ajuster MY_SqlContext(string nameOrConnectionString) grâce à l'appel MultipleDbConfiguration.GetMySqlConnection(nameOrConnectionString)
CE QUE C'EST!!!
FYIW - j'ai eu le même problème. La seule chose qui a résolu le problème était d'ajouter le code suivant au début de mon programme à l'exécution.
Vous avez raison qu'il y a un seul DbConfiguration par domaine d'application plutôt que par le contexte. Il n'y a plus d'informations sur la façon de spécifier ici - http://msdn.microsoft.com/en-us/data/jj680699#Moving. Si vous avez plusieurs configurations et voulez-vous que le bon est chargé, alors vous voudrez probablement le fichier de configuration de l'option de la statique DbConfiguration.SetConfiguration méthode.
Il ressemble à MySQL est le remplacement d'un bouquet de services dans la résolution de dépendances, mais les implémentations ils sont l'enregistrement ne fonctionne que pour MySQL.
À base de Code de configuration est vraiment conçu pour les développeurs de créer leur config plutôt que pour les prestataires individuels pour expédier un pré-cuite un (puisqu'il y a seulement un par domaine d'application).
Ma recommandation est de ne pas utiliser le leur, créer vous-même et de vous inscrire uniquement les services dont vous avez besoin/voulez. Par exemple, sur leur stratégie d'exécution serait une bonne chose de s'inscrire - et l'inscription est spécifique au fournisseur:
SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () => new MySqlExecutionStrategy());
Il y aura probablement un peu de trail et de l'erreur que vous travaillez exactement ce qui doit être inscrit dans l'ordre de leur fournisseur à travailler.
Vous pouvez utiliser le contexte constructeur qui prend un DBConnection et de fournir la bonne connexion du contexte.
Pour un exemple voir cette question: EF6 et de multiples configurations (SQL Server et SQL Server Compact)
J'ai eu la même erreur, et dans mon cas, j'ai eu un
DbConfiguration
classe définie dans une autre assemblée. Même si c'était dans la même dll comme leDbContext
je pense que cela ne les captures présent au moment de l'exécution en raison d'un chargement différé ou de réflexion ou de quelque chose.Le meilleur moyen que j'ai trouvé était de le mettre dans le web.config ou app.config à l'aide de la
codeConfigurationType
attribut sur laentityFramework
nœud comme décrit ici.