代码之家  ›  专栏  ›  技术社区  ›  Rodney S. Foley

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

  •  5
  • Rodney S. Foley  · 技术社区  · 15 年前

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

    在我的WPF应用程序中,用户可以在运行时在不同的数据库之间切换。当他们这样做的时候,我想能够做一个 快的 检查数据库是否仍然可用。我很容易得到的是ObjectContext。我正在执行的测试正在获取一个非常小的表的总记录数,如果它返回结果,那么它就通过了,如果我得到一个异常,那么它就失败了。我不喜欢这个测试,它似乎是对ObjectContext最简单的测试。

    我已经尝试在连接字符串和objectcontext中设置连接超时,并且似乎对第一个场景进行了任何更改,而第二个场景已经很快了,因此如果发生任何更改,都不会引起注意。

    情景一

    如果在第一次访问之前连接已断开,则需要大约30秒,然后才会给出底层提供程序失败的异常。

    方案二

    如果启动应用程序时数据库已启动,并且我访问了它,那么在使用测试时连接将迅速中断,并几乎立即返回。

    我希望描述的第一个场景和描述的第二个场景一样快。

    请告诉我如何最好地解决这个问题,如果有更好的方法来测试数据库的连接,请尽快提出建议。

    2 回复  |  直到 11 年前
        1
  •  3
  •   Rodney S. Foley    15 年前

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

    public bool IsContextValid(SomeDbLocation location)
    {
        bool isValid = false;
    
        try
        {
            context = GetContext(location);
            context.SomeSmallTable.Count();
            isValid = true;                
        }
        catch
        {
            isValid = false;
        }
    
        return isValid;
    }
    
        2
  •  0
  •   user3427802    11 年前

    您可能需要使用context.database.connection.open()。