2008-11-04 7 views
2

Je stocke normalement toutes mes configs dans le registre. Même si j'ai commencé à utiliser LINQ, je ne voudrais pas avoir le DSN dans le web.config, mais plutôt le laisser dans le registre et l'attacher (peut-être dans l'Application Start Event) à la configuration du système.Définir LINQ DSN pour DataContext

Comment cela peut-il être fait?

Merci pour vos idées!

edit: pour être clair: je ne veux pas écrire dans le fichier web.config, je veux juste garder le dsn (crypté) n'importe où ailleurs que le web.config, donc j'ai le même web.config sur toutes les étapes de développement (local, staginf, live, backup).

Christoph

Code Solution VB.Net:

1) Ajouter une nouvelle classe, avec une méthode, qui hérite de la DataContext d'origine:

Public Class MyDatabaseDataContext 

Inherits DatabaseDataContext 

Public Sub New() 
    MyBase.New(Settings.DSN) 
End Sub 

End Class 

2) Utilisation cette classe dans toutes les sources de données Linq au lieu du contexte d'origine.

ContextTypeName="MyProject.MyDatabaseDataContext 
+0

Il est préférable de ne pas essayer de combattre le système et de passer aux fichiers de configuration, aux blocs de configuration personnalisés et aux classes de paramètres, car le framework l'encourage. Ce n'est plus VB6;) – TheSoftwareJedi

Répondre

1

Voici ce que je fais. J'ai une classe de base pour mon DataContext. Il s'appelle DataContextBase et est généré par sqlmetal.exe. J'ai une classe dérivée appelée DataContext qui est ce qui est utilisé dans mes appels Linq. Il ressemble à ceci:

public class DataContext : DataContextBase 
{ 
    public DataContext() 
     : base(ConnectionHolder.ConnectionString) 
    { 
    } 
} 

J'ai une classe statique dans ma bibliothèque appelée ConnectionHolder qui stocke la chaîne de connexion:

public static class ConnectionHolder 
{ 
    static string _ConnectionString; 

    public static string ConnectionString 
    { 
     get { return _ConnectionString; } 
     set { _ConnectionString = value; } 
    } 
} 

(Note: Ceci est séparé de DataContext parce qu'il ya des endroits dans mon application en dehors de Linq que j'utilise la chaîne de connexion). Au démarrage de l'application, je dis ConnectionHolder.ConnectionString = (où vous stockez la chaîne de connexion).

1

Pourquoi ne pas le garder crypté dans le web.config? Il est assez facile de chiffrer uniquement les chaînes de connexion dans le fichier web.config sur Application_Start, si vous ne souhaitez pas utiliser aspreg_iis. Vous pouvez même éditer le web.config chiffré par la suite en utilisant l'outil Admin IIS.

Configuration config = WebConfigurationManager.OpenWebConfiguration(
           HttpContext.Current.Request.ApplicationPath); 
ConfigurationSection section = config.Sections["connectionStrings"]; 
if (!section.SectionInformation.IsProtected 
    && !GlobalConfiguration.ApplicationVersion.EndsWith("dev")) // don't encrypt dev 
{ 
    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); 
    config.Save(); 
} 

Si vous devez le stocker dans le registre. Vous pouvez toujours utiliser le constructeur sur le DataContext qui prend une chaîne de connexion et transmettre la valeur que vous avez lue dans le registre. Vraisemblablement, vous le stockez dans le magasin d'applications, vous n'avez donc besoin de lire qu'une seule fois dans le registre.

Scott Guthrie a une bonne page references pour crypter votre configuration web, bien que la plupart des exemples utilisent aspreg_iis. Je préfère le faire sur Application_Start donc je n'oublie pas de le chiffrer accidentellement.

+0

J'ai déjà utilisé l'écrasement du constructeur de DataContext, mais cela a 2 problèmes: Je dois supprimer le constructeur par défaut dans DB.designer.vb et chaque fois que je change le dbml, le constructeur dans le DB.designer.vb est recréé. – Christoph

+0

Est-il impossible d'initialiser le DataContext avec un DSN personnalisé au démarrage de l'application? – Christoph

+0

Vous ne voulez pas un seul DataContext pendant toute la durée de vie de votre application. Créez-les comme vous en avez besoin. – Keltex

0

Ceci est une exigence assez raisonnable lorsque vous travaillez avec du code existant.

La classe DataContext est une classe partielle, donc j'ajoute simplement une méthode usine statique qui charge le paramètre de configuration et crée le résultat datacontext.

+0

Quelle méthode ajoutez-vous? Dans DB.designer.vb, un sous-registre public existe déjà, donc si un sous-registre public est ajouté dans mon DB.vb, j'obtiens une erreur de définition de fonction en double. Si je supprime cette méthode dans le DB.designer.vb, tout va bien, mais si un edit le dbml le sub everytime est recréé ... – Christoph

Questions connexes