ConnectionString mit Entity Framework Model verbinden



  • Hallo,

    meinem Projekt (WinForms) habe ich zunächst zwei Datenbanken zugefügt (Test und Produktiv).
    Da die Tabellennamen etc. gleich sind, hab ich den Modelnnen jeweils einen anderen Namespace zugeordnet, um so keine Probleme zu bekommen?!

    Die Daten für die Connection stehen dazu ja in der App.Config
    Um diese abzurufen bzw. um zwischen den Datenbanken wechseln zu können, hab ich folgendes gemacht (in gekürzerter Form:

    public string GetIdentification()
            {
                string connectionString = String.Empty;
                string user = String.Empty;
                string database = String.Empty;
    
                try
                {
                    string db = Identification.Connection.GetConnectionString(user, out user, out database, out connectionString);
                    return db;
                }
                catch
                {
                    return null;
                }
            }
    
    public string GetConnectionString(string fullQualifiedUserName, out string user, out string database, out string connectionString)
            {
                user = "user";
                database = "tbcEntities"; // Test-DB
                //database = "bcEntities"; // Produktiv-DB
                connectionString = "";
                try
                {
                    connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[database].ConnectionString;
                    return connectionString;
                }
                catch (Exception ex)
                {
                    return null;
                }
            }
    

    Soweit so gut ... je nachdem welche database ich angebe, erhalte ich als connectionString auch die richtigen Angaben zurück.

    Nun mein Problem: Diese Angaben möchte ich nun auf mein Model (.edmx) anwenden.
    Nur wie?? Ich stehe grad wirklich auf dem Schlauch ...

    Folgender Versuch ... aber ohne ERfolg 😞

    public static void test()
            {
                string connectionString = con.GetIdentification();
    
                using (Projektname.tbcEntities context = new Projektname.tbcEntities(connectionString)) ;
                {
                    List<Projektname.tbl_name> listNames = new List<Projektname.tbl_name>();
    
                    //var query = from i in context.tblartikel
                    //            orderby i.ArtikelID
                    //            select i;
    
                    //foreach (...)
                    //{
                    //    listNames.Add();
                    //}
    
                }
            }
    

    Wie kann ich also Zugriff über ein DataModel auf meine Daten bekommen?
    Liegt das Problem vielleicht an den unterschiedlichen Namespaces? Oder oder ...?
    Würde mich echt sher über Eure Hilfe freuen, da ich grad nicht mehr so ganz weiter weiß ...



  • Ich bin nun einen Schritt weiter, eine Abfrage der Datenbank funktioniert. Allerdings nicht variabel:

    Für Namespace1

    public static IEnumerable<Namespace1.tabelle1> test()
            {
                using (Namespace1.bcEntities p = new Namespace1.bcEntities(Connection.GetIdentification()))
                {
                    List<Namespace1.tabelle1> liste = new List<Namespace1.tabelle1>();
    ...
    

    Für Namespace2

    public static IEnumerable<Namespace2.tabelle1> test2()
            {
                using (Namespace2.tbcEntities p = new Namespace1.tbcEntities(Connection.GetIdentification()))
                {
                    List<Namespace2.tabelle1> liste = new List<Namespace2.tabelle1>();
    ...
    

    Im Prinzip würde es funktionieren, wenn ich nicht bei der Funktion immer den Namespace anpassen müsste. Wie kann ich diese Stelle allgemein halten?

    So dass ich eben nur dies ändern muss (was ja bei richtigem Namespace richtig ist)

    ...
    database = "tbcEntities"; // Test-DB
                //database = "bcEntities"; // Produktiv-DB
                connectionString = "";
                try
                {
                    connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[database].ConnectionString;
                    return connectionString;
                }
    ...
    


  • Bonaqua schrieb:

    meinem Projekt (WinForms) habe ich zunächst zwei Datenbanken zugefügt (Test und Produktiv).
    Da die Tabellennamen etc. gleich sind, hab ich den Modelnnen jeweils einen anderen Namespace zugeordnet, um so keine Probleme zu bekommen?!

    Eins verstehe ich nicht so ganz: Warum unterschiedliche Datenbanken UND Namespaces?

    Ich würde eher erwarten das es eine Produktiv- und eine Testdatenbank gibt, die an sich exakt gleich arbeiten (Sprich: Ausschließlich die konkrete Datenbank muss gewechselt werden). [Keine Unterschiede im Modell nötig]



  • @asc
    Ich habe folgenden Thread gefunden und bin davon ausgegangen, dass es sonst nicht anderst funktioniert?

    Wie kann ich es sonst anderst lösen - also so wie Du meinst?
    Bin wirklich über jeden Tipp dankbar!!



  • Bonaqua schrieb:

    @asc
    Ich habe folgenden Thread gefunden und bin davon ausgegangen, dass es sonst nicht anderst funktioniert?

    Ich arbeite vermutlich nicht mit dem EF-Ansatz mit dem du arbeitest, aber normalerweise hat man EIN Datenbankmodel, der Connectionstring ist ja erst einmal egal, auf welcher Datenbank er arbeitet, wenn das Modell identisch ist.

    Bonaqua schrieb:

    Wie kann ich es sonst anderst lösen - also so wie Du meinst?
    Bin wirklich über jeden Tipp dankbar!!

    Ich arbeite wie gesagt mit Sicherheit mit einem anderen Ansatz (Code First). Es bestand zwar Initial eine Datenbank (Migration von Access) und ich habe daraus Code generiert (mit DB First wäre dies in etwa gleich bedeutend mit dem Generieren eines Models). Ich habe meinem Projekt niemals eine Datenbanken hinzu gefügt (sondern nur das Modell [in meinem Fall rein durch Code abgebildet]). Und das hat ein Connectionstring den man beliebig ändern kann.

    Man setzt ja in der Regel auch immer nur eine Datenbank gleichzeitig ein.



  • Ja, ich arbeite mit dem Ansatz Database-First.
    Verwendest Du dann für den ConnectionString auch die App.Config?



  • Derzeit ja, in Zukunft werde ich aber auch einen optionalen Weg anbieten (Gerade für die Testumgebung - um zwischen mehreren umschalten zu können).



  • Wie machst Du es dann derzeit, um zwischen mehreren Umgebungen umschalten zu können?



  • Bonaqua schrieb:

    Wie machst Du es dann derzeit, um zwischen mehreren Umgebungen umschalten zu können?

    App.Config anpassen, dafür ist sie schließlich da.



  • asc schrieb:

    Bonaqua schrieb:

    Wie machst Du es dann derzeit, um zwischen mehreren Umgebungen umschalten zu können?

    App.Config anpassen, dafür ist sie schließlich da.

    Danke - mache das nun auch so und klappt wunderbar! 🙂


Anmelden zum Antworten