Comment changer la base de données - Schéma utilisé par Entity Framework (base de données mysql)?

c# connection database entity-framework mysql

Question

J'utilise EntityFramework dans un projet pour me connecter à une base de données Mysql. Le fournisseur est Devart Dot.connect.

Cette application doit se connecter à une base de données en utilisant les paramètres de connexion définis par l'utilisateur lors de l'exécution. Cela inclut bien sûr le nom de la base de données Mysql.

J'ai utilisé les classes EntityConnectionStringBuiler et EntityConnection pour créer et stocker les paramètres de connexion personnalisés.

Le problème est que même avec de tels paramètres, l'application se connecte toujours à la base de données nommée lors de la conception d'EntityModel à l'aide de l'assistant de Visual Studio. Ce qui est très étrange, c’est que lors du débogage et de la vérification de l’état d’ObjectContext, les paramètres de connexion personnalisés sont correctement utilisés ... Cela me rend fou !!!!! Un indice?

Réponse acceptée

Après avoir passé une journée sur ce sujet, j'ai finalement compris que le problème venait du fichier model.edmx.

Dans ce fichier, vous avez une ligne par EntitySet. Sur chaque élément EntitySet, il existe un attribut appelé schéma. Dans le cas de SQL Server, cet attribut est défini sur le schéma de la table associée:

EntitySet Name = "annee_civile" EntityType = "openemisModel.Store.annee_civile" store: Type = "Tables" Schema = "mydatabase" />

Si vous indiquez le nom du schéma lors de la construction d'EntityConnection, il semblerait qu'il y ait un conflit et que, finalement, le schéma défini dans le fichier edmx sera utilisé même si vous en avez spécifié un autre dans les paramètres de connexion.

La solution consiste simplement à supprimer le nom du schéma dans le fichier edmx. CECI FONCTIONNE POUR MYSQL, probablement pas lors de la connexion à un serveur SQL.

EntitySet Name = "annee_civile" EntityType = "openemisModel.Store.annee_civile" store: Type = "Tables" Schema = "" />

EntityConnectionStringBuilder:

string providedString = "Identifiant utilisateur = xxxx; Mot de passe = xxx; Hôte = xxxx; Base de données = nom quelconque du fichier"; EntityConnectionStringBuilder entityConnBuilder = new EntityConnectionStringBuilder (); entityConnBuilder.Provider = "Devart.Data.MySql"; entityConnBuilder.Metadata = @ "res: // /OpenEmisModel.csdl|res:// /OpenEmisModel.ssdl|res://*/OpenEmisModel.msl"; entityConnBuilder.ProviderConnectionString = providedString;

EntityConnection et le contexte d'objet l'utilisant:

EntityConnection entityConnexionEmis = new EntityConnection (entityConnBuilder.ConnectionString);

objectcontextEntities testingContext = new objectcontextEntities (entityConnexionEmis);

Le logiciel est maintenant capable de se connecter à n’importe quel nom de base de données.

J'espère que cela t'aides.


Réponse populaire

Référencez la dll Devart.Data.MySql.Entity.EF6.dll dans le projet.

Quelque part, au démarrage de votre application et avant les opérations de base de données, ajoutez les éléments suivants:

var config = MySqlEntityProviderConfig.Instance;
config.Workarounds.IgnoreSchemaName = true;

Vous devrez faire référence à:

using Devart.Data.MySql.Entity.Configuration;


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow