在實體框架內快速測試數據庫連接

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

[ 我是ADO.NET和實體框架的新手,如果這個問題看起來很奇怪,請原諒我。 ]

在我的WPF應用程序中,用戶可以在運行時在不同的數據庫之間切換。當他們這樣做時,我希望能夠快速檢查數據庫是否仍然可用。我很容易獲得的是ObjectContext。我正在進行的測試是計算一個非常小的表的總記錄,如果它返回結果然後它通過,如果我得到一個異常然後它失敗。我不喜歡這個測試,它似乎最容易使用ObjectContext。

我已嘗試在連接字符串和ObjectConntext中設置連接超時,並且似乎更改了第一個方案的任何內容,而第二個方案已經很快,因此如果它發生任何變化則不明顯。

情景一

如果在第一次訪問之前連接已關閉,則需要大約30秒才會發出基礎提供程序失敗的異常。

情景二

如果我啟動應用程序並且訪問它時數據庫已啟動,那麼在使用測試時連接斷開很快並且幾乎立即返回。

我希望描述的第一個場景與第二個場景一樣快。

請讓我知道如何最好地解決這個問題,如果有更好的方法來快速測試與數據庫的連接,請告知。

一般承認的答案

確實沒有簡單或快捷的方法來解決這個問題。實體框架將忽略ConnectionTimeout值。我使用的解決方案是創建一個方法,通過傳入要驗證的位置來檢查上下文是否有效,然後從已知的非常小的表中獲取計數。如果這會引發異常,則上下文無效,否則為無效。以下是一些示例代碼。

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

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

    return isValid;
}

熱門答案

您可能需要使用context.Database.Connection.Open()



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因