6
votes

Deux projets .NET, une chaîne de connexion DB?

J'ai une solution .NET contenant deux projets:

  • Un projet ASP.NET MVC, "Site"
  • une bibliothèque de classe, "modèles"

    Le projet "Modèles" contient un contexte de données LINQ-TO-SQL avec quelques classes partielles qui étendent les objets de base de données.

    La chaîne de connexion est définie dans le Web.config du projet "Site Web".

    Cependant, le projet "Modèles" semble avoir sa propre application.Config où la connexion de la base de données est définie séparément.

    Cela signifie que si la chaîne de connexion change, je devrai mettre à jour les deux projets.

    Y a-t-il une façon de centraliser la chaîne de connexion à un endroit et que les deux projets l'utilisent-ils?


0 commentaires

9 Réponses :


1
votes

Je dirais que vous devriez conserver la configuration du produit dans le Web.config du projet Web, puis injecter la configuration que vous utilisez dans le projet modèle.


0 commentaires

2
votes

C'est bien. Mettez la chaîne de connexion du modèle dans Web.config et oubliez (Supprimer) le fichier de configuration du modèle.

Le DataContext prend également une chaîne de connexion dans son constructeur afin que vous puissiez la spécifier de manière aussi (peut-être pas sur une ligne) : P>

System.Configuration.DefaultSettingValueAttribute("Data Source=SERVER;Initial Catalog=XYZ;Integrated Security=True")].


1 commentaires

@Richardod: Je commente, mais je n'ai pas réellement posé la question, même si j'avais posé une similiaire à celle-ci un pendant le retour. Je n'ai jamais essayé de supprimer le fichier AppConfig. Ma tante l'avait suggéré, mais j'ai aussi eu des modèles de données dans le projet et, dans ce cas, vous devez créer de nombreuses classes partielles de tableaux de table, et je n'allais pas faire cela, donc je n'ai pas essayé de supprimer l'application. config, mais j'imagine que cela fonctionnerait.



0
votes

OK, je devine ici, mais il semble que les deux projets utilisent une chaîne de connexion identique, oui?

Dans ce cas, spécifiez uniquement la chaîne de connexion dans le web.config; La bibliothèque de classe app.config ne sera pas lue par ASP.NET quand même.


4 commentaires

Cela n'a pas été mon expérience à moins d'avoir eu quelque chose de mal configuré.


Ah bon? Utilisez-vous un composant tiers qui le fait pour vous? Parce que dans mon expérience, seule l'app.config pour l'exécutable (ou dans le cas de ASP.NET web.config) est lu par le système par défaut. S'il y a une application APP.Config associée à une bibliothèque de classe (.dll), le contenu de cette application.config doit être a) chargé manuellement (ce qui correspond aux composants tiers qui le font pour vous) ou B) copiées à la app.config / web.config de l'application principale.


@Randolpho: S'il vous plaît voir Stackoverflow.com/questions/1148559 pour plus de clarification car elle se rapporte à moi.


@Randolpho: En passant, je ne vous ai pas révélé, quelqu'un m'a aussi évité.



0
votes

Je pense que la chaîne de connexion dans la bibliothèque de modèles est utilisée uniquement par le concepteur. Pendant l'exécution, la chaîne est chargée à partir du web.config. Donc, vous n'avez pas nécessairement besoin d'avoir les chaînes synchronisées.


1 commentaires

Ce n'est pas ce que j'ai trouvé après le déploiement d'une solution comme celle-ci dans la production. La bibliothèque a continué de tirer sa connexion de l'app.config.



4
votes

Créer une classe partielle identique à celle de votre contexte de données et utilisez ce code pour forcer l'utilisation de la chaîne web.config par opposition à l'app.config. Mettez la classe partielle au même endroit que votre modèle dans la bibliothèque de classe.

public partial class YourDataContext 
{
    partial void OnCreated()
    {
        ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"];

        if (cs != null)
        {
             this.Connection.ConnectionString = cs.ConnectionString;
        }
    }
}


5 commentaires

Mais comment cela fonctionnera-t-il, car les classes partielles doivent appartenir à la même assemblée? Je souhaite que l'assemblage "Modèles" utilise la chaîne de connexion du web.config dans l'assemblage "Site Web".


BTW, je n'ai pas fait de descendance.


Le code ci-dessus tentera de définir la chaîne de connexion sur «PrincipalConnectionstring» qu'il trouvera dans le Web.config car c'est là que le gestionnaire de configuration sera l'air. Sinon, si la valeur est NULL, la méthode Oncreated continuera et utilisera les informations par défaut trouvées dans la classe de contexte de données générée par le concepteur. Richardod a posté un excellent lien qui discute de tout ce sujet. Vous pouvez également essayer de lire ma question similaire sur ce Stackoverflow.com/questions/1148559


J'ajouterais peut-être aussi que j'ai appelé ma chaîne de connexion APP.Config quelque chose de différent de mon Web CS, "secondaireConnectionstring"


Croyez-moi que cela fonctionnera, parce que je le fais comme ça dans mon projet. Mettez cette classe partielle au même endroit que le modèle et voir!



0
votes

Vous n'avez pas besoin de la bibliothèque de classe app.config. Il suffit de mettre votre configuration sur le web.config. De plus, si vous avez besoin d'une section de configuration à partir de l'app.config de la bibliothèque, mettez-le sur le Web.config. Le configurationManager le lit à partir de là.


0 commentaires

0
votes

Si votre bibliothèque de classe de modèles est référencée dans votre application Web, vous pouvez simplement supprimer la référence dans le fichier app.config et vous assurer d'avoir quelque chose de similaire à celui placé sur votre site Web. config. De cette façon, lorsque le compilateur regarde dans le web.config, il trouvera la chaîne de connexion qu'il a besoin pour le projet MVC et n'a donc pas besoin de regarder plus loin pour cela.


2 commentaires

J'ai essayé cela, mais il semble avoir la chaîne de connexion à partir d'un fichier "Paramètres" sous les propriétés du projet Modèles. Il y a du code comme celui-ci dans la classe: 'Global :: Modèles.Properties.Settings.default.webConnectionsR ing, Mappingsource)'


@jonathanconroy: C'est exactement pourquoi ma réponse vous aidera à contourner ce problème.



0
votes

Personnellement, je prolonge DataContext dans mon mode de destinititoit puis fait quelque chose comme: XXX

De cette façon, mon référentiel peut être instancié et que je ne vous inquiétez jamais de la configuration d'une connexion ou de la traiter quoi que ce soit. Pour changer / des bases de données Dev / Live, je change simplement mon web.config.


0 commentaires

0
votes

L'app.config dans la bibliothèque n'aura pas d'effet de production - ces chaînes de connexion sont vraiment là pour le concepteur LINQ2SQL. Rien à voir, bouger, ce n'est pas les droïdes que nous recherchons. . .


0 commentaires