Laden...

SQL Error wenn ViewModel im XAML gesetzt wird

Erstellt von Kriz vor 3 Jahren Letzter Beitrag vor 3 Jahren 639 Views
K
Kriz Themenstarter:in
141 Beiträge seit 2017
vor 3 Jahren
SQL Error wenn ViewModel im XAML gesetzt wird

Hallo zusammen,

ich weise meiner View das Viewmodel in XAML zu:

<Window.DataContext>
    <ViewModel:Home_VM x:Name="VM"/>
</Window.DataContext>

Hier wird mir die mittlere Zeile als Fehler markiert:> Fehlermeldung:

Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: SQL Network Interfaces, error: 26 - Fehler beim Bestimmen des angegebenen Servers/der angegebenen Instanz)

Mein ViewModel:

public class VM : BaseViewModel
    {

        private ObservableCollection<Song> _HitList;

        public ObservableCollection<Song> HitList
        {
            get
            {
                using (var db = new DB())
                {
                    List<Album> ListOfAlbums = new List<Album>(db.Albums);
                    List<Interpret> interprets = new List<Interpret>(db.Interprets);
                    return new ObservableCollection<Song>(new List<Song>(db.Songs.OrderBy(x => x.Played)).Take(10));

                }
            }
            set
            {
                _HitList = value;
                RaisePropertyChanged(nameof(HitList));
            }
        }

        private ObservableCollection<Album> _WhatsNewList;
        public ObservableCollection<Album> WhatsNewList
        {
            get
            {
                using (var db = new DB())
                {
                    List<Interpret> interprets = new List<Interpret>(db.Interprets);
                    List<Album> ListOfAlbums = new List<Album>(db.Albums);
                    List<Album> Sorted = new List<Album>(ListOfAlbums.Where(x => DateTime.Parse(x.ImportDate) > DateTime.Now.AddDays(-7)));
                    return new ObservableCollection<Album>(Sorted);
                }

            }
            set
            {
                _WhatsNewList = value;
                RaisePropertyChanged(nameof(WhatsNewList));
            }
        }

        public VM()
        {

        }
    }

Die App wird zwar fehlerfrei gebaut und funktioniert auch einwandfrei, aber sobald ich im XAML Code arbeiten will, hängt sich VS für mehrere Sekunden auf, und das jedes mal wenn ich was tippe, kopiere, oder lösche, arbeiten also unmöglich.

Es liegt wohl daran, dass im Konstruktor meines Viewmodels bzw in den Propertys bei der Initialisierung der Klasse, auf die DB (in meinem Fall Entity Framework) zugegriffen wird.
Wenn ich alle DB Zugriffe auskommentiere, ist das Problem auch verschwunden.
Wie kann ich nun die Klasse aufbauen, dass beim Starten der Anwendung auf die DB zugegriffen wird, ohne dass mir dieser Fehler die Arbeit undmögloch macht?

Vielen Dank im Vorraus!

W
955 Beiträge seit 2010
vor 3 Jahren

Na lies dir doch mal den Fehler genau durch und behebe das Netzwerkproblem. 🤔

16.807 Beiträge seit 2008
vor 3 Jahren

Fehler 26 ist meines Wissens der bekannteste und meist auftretende Fehler beim MSSQL Server - und hat entgegen Deinem Text nichts mit der Anwendung oder Visual Studio zutun. Steht eigentlich auch so deutlich genug im Fehlertext.
Wenn es hier nicht im Forum dutzende Treffer gibt und tausende Treffer bei Google würde mich das wundern.

Kannst ja den passenden Treffer hier verlinken.

PS: Zusätzlich der Hinweis, dass Du Deinen Datenbank-Code eigentlich genau so umgesetzt hast, wie man es nicht tun sollte.

K
Kriz Themenstarter:in
141 Beiträge seit 2017
vor 3 Jahren

Das Netzwerkproblem, das beschrieben wird, existiert ja nur im XAML Editor. Sowohl im ViewModel, als auch In der laufenden Anwendung werden keine Fehler angezeigt. Wo suche ich denn da?
Und die drei Schichten-Architektur wird doch in dem Fall umgesetzt?! Ich habe meine Datenbankklasse, meine UI und das ViewModel, was die beiden verbindet, oder verstehe ich da was falsch?

16.807 Beiträge seit 2008
vor 3 Jahren

Lies Dir bitte den Fehler durch. Es ist ein Netzwerkfehler: der Server kann nicht gefunden werden.
Ergo verwendest Du entweder einen falschen ConnectionString oder der Server ist unter diesem für diese Verbindungsart nicht erreichbar.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Es liegt definitiv nicht am XAML Editor selbst.
Davon abgesehen wäre der richtige Weg, wenn Du dem ViewModel den Context übergeben würdest.
Man eröffnet aber auf keinen Fall Datenbank-Verbindungen in einem Getter oder interagiert mit externen Datenquellen über einen Getter.
Das fällt unter Antipattern.

K
Kriz Themenstarter:in
141 Beiträge seit 2017
vor 3 Jahren

Was mir nicht in den Kopd geht, ist dass die Anwendung ohne Probleme läuft und auch im ViewModel direkt kein Fehler angezeigt wird, nur im XAML Editor...

16.807 Beiträge seit 2008
vor 3 Jahren

Die Design Instance des Editors erzeugt eine Instanz des ViewModels und greift zB auf die Properties zu.
Das schlägt aber fehl, weil Du im Getter Zeugs drin hat, was da nicht rein gehört. Exception => Editor unterstreicht das Rot.

Die einzige Möglichkeit ist, dass Du das Zeugs, was nicht in den Getter gehört, sauber entkoppelst und so umsetzt, wie man es machen sollte.
-> Keine IO Operationen im Getter
-> Context inject
Insgesamt solltest Du Dein gesamtes ViewModel überarbeiten, sind einige Issues drin wie zB auch die toten Fields.

Sehr simpel kann man das mit der Integration von Reactive Extensions lösen.
Reactive WPF – Part 1 – Introduction to Reactive Extensions

PS: Entitäten in der View ist weniger ein Problem, wenn auch eine Abhängigkeit.
Aber die DB-Operationen gehören einfach nicht in das ViewModel - und schon zehn Mal nicht in den Getter.

W
955 Beiträge seit 2010
vor 3 Jahren

Ich denke nicht dass es günstig ist im Konstruktor des VM oder der View mit dem EF zu arbeiten. Also erst diese Objekte erstellen (vllt mit DependencyInjection) und dann zu einem späteren Zeitpunkt die mit dem EF gelesenen Modelle an das VM übergeben. Hierzu das von Abt verlinkten Drei-Schichten-Artikel verwenden. Dann sollte auch der Designer klappen weil dann nicht immer eine Verbindung zur Datenbank aufgebaut wird.