12
votes

Constructeur DBContext généré par le code

Je suis sûr que j'ai déjà fait cela auparavant à un moment donné, mais je ne peux pas comprendre comment maintenant! Mon scénario:

public partial class HOLDbEntities
{
    private const string _contextName = "HOLDbEntities";
    public static string ContextName { get { return _contextName; } }

    public HOLDbEntities()
        : base(ContextName)
    {
    }
}


2 commentaires

Les classes partielles font partie de la même classe, il n'ya donc aucun moyen d'avoir deux méthodes ou plus (constructeur inclus) avec la même signature. Dans l'exemple donné, vous pouvez supprimer le constructeur en classe partielle générée ( Remarque: Si vous régénérez une entité, vos modifications seront perdues) ou un constructeur de surcharge (par exemple, Holdbentititions publiques (String ContexteName): base ) ).


J'ajouterais simplement un autre constructeur avec le paramètre dont vous avez besoin pour que les deux existent et dans votre code d'appel, vous décidez lequel utiliser


5 Réponses :


10
votes

Le meilleur que je peux suggérer est une méthode d'usine: xxx

et utilisez Holdbentitities.create () plutôt que Nouvelles Holdbentities () .


3 commentaires

Cela semble très élégant à ce que j'essaie d'atteindre, je vais lui donner un coup maintenant et voir si cela fonctionne!


Fonctionne bien, mais l'unité se plaint désormais que le contexte ne peut pas être construit avec une valeur de chaîne. Toute façon autour de cela? Votre réponse est correcte pour mon scénario de toute façon.


Dans MSDN, il est indiqué que DBContext Constructor de remplacement d'une chaîne construit une nouvelle instance de contexte à l'aide de la chaîne donnée en tant que nom ou chaîne de connexion pour la base de données à laquelle une connexion sera effectuée. - Pouvez-vous s'il vous plaît, vous m'expliquez clairement ou donnez-moi un exemple ou une référence. Je n'ai trouvé aucun bon résultat en cherchant cela :(



21
votes

i à la hausse de la réponse acceptée précédente car c'est un moyen assez élégant de le faire. Cependant, une autre approche serait de modifier le modèle T4 qui génère la classe DBContext.

Lorsque vous utilisez EF DB, vous avez un fichier .EDMX et sous celui-ci, vous avez un fichier [entité] .Context.tt. Aller dans ce fichier et supprimer (ou modifier) ​​le code suivant: xxx

Votre classe de contexte générera sans constructeur, vous devriez donc pouvoir en créer un dans une classe étendue.


4 commentaires

Le code T4 ne sera-t-il pas régénéré si vous, dites, faites-le glisser une autre table sur le concepteur?


@AVRAHAMSEFF NOPE, le T4 reste le même et génère des fichiers .cs. Toute modification apportée aux fichiers .CS serait renvoyée de la manière que vous décrivez, mais ceci est une modification du fichier qui effectue la génération.


@ AS9876 Le code T4 comprend un code générique qui compte sur les types d'entité, il n'est donc pas nécessaire de régénérer lors de la régénération lorsque de nouveaux types d'entité sont ajoutés.


Si vous allez modifier le modèle T4, pourquoi ne pas simplement modifier le constructeur là-bas au lieu de le supprimer et d'ajouter une autre classe partielle?



0
votes

Voici ma solution au problème. Je modifie le fichier TT alors que Dylan Hayes a suggéré et remplacé le constructeur avec le mien. Dans mon cas, je devais changer les noms de schéma de certains schémas. J'ai défini une variable dans le fichier de configuration pour me dire quel environnement j'étais dans et utilisé le bon schéma. XXX


0 commentaires

3
votes

J'ai changé le contexte.tt comme suit: xxx

afin que je puisse déclarer une méthode Onmodelconstructée dans une classe partielle du contexte. < / p>


0 commentaires

0
votes

J'ai utilisé la fonctionnalité d'interpolations de chaîne de C # 6 dans le fichier de génération .tt .
Le code généré devient xxx

lorsque vous utilisez xxx

dans le fichier .tt .

Connections String String StringRingKey (String Key) dans la classe statique MyConfigurationManager Dans mon cas ajoute les initiales de la connexion à la touche et vérifie si une chaîne de connexion dans ConfigurationManager.ConnectionsTrings a cette touche auquel cas la clé est renvoyée et renvoie simplement la clé par défaut.

donc maintenant, les connexionstring peuvent donc être différents par utilisateur.
Par exemple. xxx

signifie que l'utilisateur f.b. utilise la dernière clé pendant que tous les autres la clé précédente.


0 commentaires