1

Je traite une application C# avec un backbone EntityFramework utilisant un DbContext. L'application a deux choix: se connecter à un serveur SQL distant express ou se connecter à une base de données SQL locale compacte 4.0 dans le cas où la connexion réseau n'est pas disponible. Lorsque mon application démarre, un thread vérifie si une connexion à la base de données distante est possible. Sinon, il doit automatiquement changer la chaîne de connexion et le fournisseur afin de se connecter à la base de données locale. Jusqu'à présent, j'essayais de résoudre ce problème en modifiant la section de chaîne de connexion dans app.config et en forçant l'application à actualiser la section, après avoir enregistré la configuration. Cette approche n'est pas la meilleure car j'ai besoin d'avoir des droits d'accès pour écrire dans le fichier app.config. Pourriez-vous suggérer une meilleure approche?Commutation automatique de la chaîne de connexion sur l'erreur de connexion à la base de données

+0

Où stockez-vous les deux chaînes de connexion? – pleinolijf

+0

En deux constantes dans une classe – Francesco

Répondre

0

Le constructeur DbContext accepte soit le nom de la connexion chaîne, ou la chaîne de connexion réelle que vous voulez choisir. Ce que vous pouvez faire, c'est tester votre chaîne de connexion initiale - peut-être avec une connexion ado rapide ou quelque chose de simple, et puis si elle se connecte, utilisez-la, sinon connectez-vous avec l'autre.

Certains pseudo-code:

 YourDbContext YourContext; 
     if (TestConnection()) 
     { 
      YourContext = new YourDbContext("ConnectionString1"); 
     } 
     else 
     { 
      YourContext = new YourDbContext("ConnectionString2"); 
     } 
+0

Comment définir le fournisseur de base de données? J'ai besoin de basculer entre un SQL Server Express et un SQL compact 4.0 – Francesco

+0

La référence à "ConnectionString" peut être le nom d'une chaîne de connexion dans votre app.config. Si possible, j'aurais juste les deux chaînes de connexion là-bas, et les référencer par leur nom. –

+0

Je ne peux pas avoir les chaînes dans le app.config, j'ai besoin de les spécifier par programme. J'ai essayé d'insérer dans la chaîne le databaseName et ai récupéré une exception "mot-clé non valide: base de données". Comment cela pourrait-il être résolu? – Francesco

2

Wrap la gestion des chaînes de connexion dans une classe, faire cette classe un singleton, et l'utiliser pour obtenir la chaîne de connexion active, comme ceci:

public delegate void ConnectionChangedEventHandler(object sender, EventArgs e); 

class ConnStringManager { 
    static public ConnStringManager Instance {get;private set;} 
    static { 
     Instance = new ConnStringManager(); 
    } 
    public event ConnectionChangedEventHandler Changed; 
    private readonly string localConn; 
    private readonly string remoteConn; 
    public string ConnectionString {get; private set;} 
    private ConnStringManager() { 
     localConn = ... // Get local connection string from the config 
     remoteConn = ... // Get remote connection string from the config 
     TestAndSetConnectionString(); 
    } 
    public void TestAndSetConnectionString() { 
     bool canUseRemote = true; 
     if (...) { 
      // Do some testing to see if remote DB is accessible 
     } 
     // Switch the connection string 
     var nextString = canUseRemote ? remoteConn : localConn; 
     bool changed = nextString != ConnectionString; 
     ConnectionString = nextString; 
     if (changed && Changed != null) { 
      Changed(this, EventArgs.Empty); 
     } 
    } 
} 
+0

Merci pour votre réponse. Cette approche de conception semble propre et efficace mais, à côté de l'encapsulation de l'ensemble dans une classe, mon problème en est un autre: comment dire au moteur entityframework que j'ai changé la chaîne de connexion et le fournisseur DB? – Francesco

+0

@Francesco Vous pouvez ajouter un événement 'Changed' pour permettre aux utilisateurs de voir les changements. Voir les modifications pour plus de détails. – dasblinkenlight

Questions connexes