【问题标题】:Quickly Testing Database Connectivity within the Entity Framework在实体框架内快速测试数据库连接
【发布时间】:2009-11-08 05:07:42
【问题描述】:

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

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

我已经尝试在连接字符串和 ObjectConntext 中设置连接超时,并且似乎在第一个场景中改变了任何东西,而第二个场景已经很快,所以如果它改变任何东西都不会引起注意。

场景一

如果在第一次访问之前连接已关闭,则大约需要 30 秒才能给我底层提供程序失败的异常。

场景二

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

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

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

【问题讨论】:

    标签: entity-framework ado.net ado.net-entity-data-model


    【解决方案1】:

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

    public bool IsContextValid(SomeDbLocation location)
    {
        bool isValid = false;
    
        try
        {
            context = GetContext(location);
            context.SomeSmallTable.Count();
            isValid = true;                
        }
        catch
        {
            isValid = false;
        }
    
        return isValid;
    }
    

    【讨论】:

    • 实体无法处理这件事太愚蠢了。无论如何它都有效。
    • 我可以知道什么是“somedblocation”吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多