C # La propriété get set ne définit pas de valeur

J'ai cherché sur Google et Stack Overflow pour ce problème que j'ai. Malheureusement, je ne suis pas en mesure de find la bonne réponse à mon problème.

Tout d'abord, je montrerai mes classs et App.config.

Classe: Form1: Form

public partial class Form1 : Form { Database db = new Database(); public Form1() { InitializeComponent(); db.Test(); } private void Form1_Load(object sender, EventArgs e) { db.MdfConnectionSsortingng = ConfigurationManager.ConnectionSsortingngs["MDFConnection"].ConnectionSsortingng; } } 

Classe: Base de données

 class Database { private ssortingng _mdfConnectionSsortingng; public ssortingng MdfConnectionSsortingng { get { return this._mdfConnectionSsortingng; } set { this._mdfConnectionSsortingng = value; } } public void Test() { MessageBox.Show(_mdfConnectionSsortingng); } 

App.config

 <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionSsortingngs> <add name="MDFConnection" connectionSsortingng="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|Database\AutoFill.mdf;Integrated Security=True;ApplicationIntent=ReadOnly" providerName="System.Data.SqlClient" /> </connectionSsortingngs> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration> 

Dans ma class Database.cs j'ai un MessageBox.Show (_mdfConnectionSsortingng); cela montrera la string privée (champ de support) mais, pour une raison étrange, le _mdfConnectionSsortingng est toujours nul.

J'ai déclaré sur ma class Form1: formulaire qu'il doit charger la string de connection dans mon App.config.

Sans oublier de mentionner que ConfigurationManager.ConnectionSsortingngs ["MDFConnection"]. ConnectionSsortingng; lui-même renvoie une valeur de sorte que ce n'est pas le problème ici.

J'espère que quelqu'un pourra m'aider sur ce problème.

EDIT 1

Changé le code pour le rendre plus clair pour les gens. Aussi l'ExecuteQuery n'est pas important donc j'ai fait une méthode simple dans la class Database.cs appelant une boîte de message.

L'exécutable et Exe.config sont également dans le même dossier lors de l'exécution.

Je n'ai pas de réponse exacte, mais je me poserai quelques questions dans la même situation.

  1. La string de connection est-elle réellement acquise? c'est-à-dire split un peu la solution pour le debugging append un point d'arrêt sur myConn comme indiqué ci-dessous.

    private void Form1_Load (expéditeur d'object, EventArgs e) {

    var myConn = ConfigurationManager.ConnectionSsortingngs ["MDFConnection"]. ConnectionSsortingng; db.MdfConnectionSsortingng = myConn;

    }

  2. Votre solution actuelle par design permet à la class de database d'être utilisée sans string de connection. Serait-il préférable de mettre la connection dans le constructor pour éliminer le bug potentiel? Par exemple

    Classe publique database {

    private ssortingng _mdfConnectionSsortingng;

    database publique (conn de string)

    {

    _mdfConnectionSsortingng = conn;

    }

    }

Vous pouvez ensuite le build sur le formulaire de chargement.

  1. Avec les fonctionnalités Web, vous ne travaillez parfois pas avec l'instance avec laquelle vous pensez travailler. Si tout le rest échoue, vous pouvez essayer de changer la class en singleton, mais le style Dependency Injection devrait être meilleur.

EDIT – Suite à votre modification, je crois que vous appelez maintenant Test avant le chargement du formulaire. Essayez le point 2 (injectez la string de connection dans le constructor) et vous savez que vous ne pouvez pas avoir une instance de la class sans une string de connection. J'ai essayé votre class dans une console et c'est bien, donc le problème est très susceptible d'être l'ordre de chargement. DI réparerait cela.

Quand la méthode est appelée? Tout en recherchant votre code dans le constructor, initialisez la string dans le constructor:

 public Form1() { db.MdfConnectionSsortingng = ConfigurationManager.ConnectionSsortingngs["MDFConnection"].ConnectionSsortingng; InitializeComponent(); } 

Form1: Formulaire

 public partial class Form1 : Form { Database db = new Database(); public Form1() { InitializeComponent(); //db.Test(); // Removed! } private void Form1_Load(object sender, EventArgs e) { db.MdfConnectionSsortingng = ConfigurationManager.ConnectionSsortingngs["MDFConnection"].ConnectionSsortingng; db.Test(); // Returns a value! :D } } 

Il semble que je chargeais mes methods avant de charger le formulaire lui-même.