Schnelles Testen der Datenbankkonnektivität innerhalb des Entity Frameworks

ado.net ado.net-entity-data-model entity-framework

Frage

[ Ich bin neu bei ADO.NET und dem Entity Framework. Verzeih mir, wenn diese Frage seltsam erscheint. ]

In meiner WPF-Anwendung kann ein Benutzer zur Laufzeit zwischen verschiedenen Datenbanken wechseln. Wenn sie dies tun, möchte ich in der Lage sein, schnell zu überprüfen, ob die Datenbank noch verfügbar ist. Was ich leicht zur Verfügung habe, ist der ObjectContext. Der Test, den ich vorforme, besteht darin, die Anzahl der Datensätze einer sehr kleinen Tabelle zu zählen. Wenn Ergebnisse zurückgegeben werden, wurden sie bestanden. Wenn ich eine Ausnahme bekomme, schlägt sie fehl. Ich mag diesen Test nicht, es schien am einfachsten mit ObjectContext zu sein.

Ich habe versucht, das Verbindungszeitlimit in der Verbindungszeichenfolge und im ObjectConntext festzulegen, und für das erste Szenario scheint sich anscheinend nichts zu ändern, während das zweite bereits schnell ist.

Szenario eins

Wenn die Verbindung vor dem ersten Zugriff unterbrochen wurde, dauert es etwa 30 Sekunden, bis eine Ausnahme angezeigt wird, dass der zugrunde liegende Anbieter fehlgeschlagen ist.

Szenario zwei

Wenn die Datenbank beim Start der Anwendung aktiv war und ich darauf zugreife, wird die Verbindung abgebrochen, und der Test wird schnell ausgeführt und kehrt fast sofort zurück.

Ich möchte, dass das erste beschriebene Szenario so schnell ist wie das zweite.

Bitte lassen Sie mich wissen, wie Sie dieses Problem am besten lösen können. Wenn es einen besseren Weg gibt, die Konnektivität zu einer DB schnell zu testen, geben Sie uns bitte Bescheid.

Akzeptierte Antwort

Es gibt wirklich keinen einfachen oder schnellen Weg, um dieses Problem zu lösen. Der ConnectionTimeout-Wert wird von Entity Framework ignoriert. Die von mir verwendete Lösung ist das Erstellen einer Methode, die prüft, ob ein Kontext gültig ist, indem Sie an dem Speicherort den zu überprüfenden Speicherort übergeben und dann die Anzahl aus einer bekannten, sehr kleinen Tabelle abrufen. Wenn dies eine Ausnahme auslöst, ist der Kontext ansonsten nicht gültig. Hier ist ein Beispielcode, der dies zeigt.

public bool IsContextValid(SomeDbLocation location)
{
    bool isValid = false;

    try
    {
        context = GetContext(location);
        context.SomeSmallTable.Count();
        isValid = true;                
    }
    catch
    {
        isValid = false;
    }

    return isValid;
}

Beliebte Antwort

Möglicherweise müssen Sie context.Database.Connection.Open () verwenden.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum