在实体框架内快速测试数据库连接

Rod*_*ley 5 ado.net entity-framework ado.net-entity-data-model

[ 我是ADO.NET和实体框架的新手,如果这个问题看起来很奇怪,请原谅我.]

在我的WPF应用程序中,用户可以在运行时在不同的数据库之间切换.当他们这样做时,我希望能够快速检查数据库是否仍然可用.我很容易获得的是ObjectContext.我正在进行的测试是计算一个非常小的表的总记录,如果它返回结果然后它通过,如果我得到一个异常然后它失败.我不喜欢这个测试,它似乎最容易使用ObjectContext.

我已尝试在连接字符串和ObjectConntext中设置连接超时,并且似乎更改了第一个方案的任何内容,而第二个方案已经很快,因此如果它发生任何变化则不明显.

情景一

如果在第一次访问之前连接已关闭,则需要大约30秒才会发出基础提供程序失败的异常.

情景二

如果我启动应用程序并且访问它时数据库已启动,那么在使用测试时连接断开很快并且几乎立即返回.

我希望描述的第一个场景与第二个场景一样快.

请让我知道如何最好地解决这个问题,如果有更好的方法来快速测试与数据库的连接,请告知.

Rod*_*ley 3

确实没有简单或快速的方法来解决这个问题。实体框架会忽略 ConnectionTimeout 值。我使用的解决方案是创建一个方法,通过传入要验证的位置来检查上下文是否有效,然后从已知的非常小的表中获取计数。如果抛出异常,则上下文无效,否则上下文无效。这是一些示例代码,展示了这一点。

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

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

    return isValid;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是愚蠢的,实体无法处理这个问题。不管怎样,它有效。 (2认同)