测试Entity Framework是否与某些东西相关联

Bob*_*way 27 .net entity-framework

创建新的EntityCollection对象时,在尝试对该集合执行某些操作之前,连接不会尝试打开数据库.我需要确定实体集合是否具有有效连接,我找不到有效的方法.

目前我的代码中有这个:

var db = new MyEntityCollection();

try
{
     var checkworking = from c in db.Customers select c;
}
catch 
{ 
     ConnectToBackUp();
}
Run Code Online (Sandbox Code Playgroud)

这不仅是可怕的代码,而且非常慢,因为它在抛出异常之前等待一个年龄来确​​定连接是否处于活动状态.

我知道我可以通过使用ConnectionTimeout来控制它在放弃之前等待多长时间,但这只是另一个丑陋的黑客行为,这使得糟糕的情况变得更糟.

当然有更好的方法吗?

Gia*_*tti 31

最简单的:

private bool TestConnection()
{
    var db = new MyEntityCollection();
    int oldTimeOut = db.CommandTimeout;

    try
    {
       db.CommandTimeout = 1;
       db.Connection.Open();   // check the database connection
       return true;
    }
    catch 
    { 
       return false;
    }
    finally 
    {
       db.CommandTimeout = oldTimeOut;
    }
}
Run Code Online (Sandbox Code Playgroud)

EF6更新:

using System.Data.Common;
...

public bool TestConnection() {
    using (var db = new MyEntityCollection()) {
        DbConnection conn = db.Database.Connection;
        try {
            conn.Open();   // check the database connection
            return true;
        }
        catch {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Stu*_*ing 11

您只是想查看数据库连接是否有效.如果有的话,看看objectcontext.databaseExists().

  • 看起来不错,但不幸的是它会抛出一个错误:"在建立与SQL Server的连接时发生了与网络相关或特定于实例的错误.未找到服务器或无法访问服务器.验证实例名称是否正确以及SQL Server配置为允许远程连接." 如果根本没有DB服务器*,以及连接字符串只是错误,我的解决方案需要工作. (3认同)

Bob*_*way 8

通过绕过房子并构建一个新的连接字符串以使用ADO进行测试解决了这个问题.仍然需要使用try catch但速度要快得多:

    private bool TestConnection()
    {
        EntityConnectionStringBuilder b = new EntityConnectionStringBuilder();
        ConnectionStringSettings entityConString = ConfigurationManager.ConnectionStrings["MyEntityConnectionString"];
        b.ConnectionString = entityConString.ConnectionString;
        string providerConnectionString = b.ProviderConnectionString;

        SqlConnectionStringBuilder conStringBuilder = new SqlConnectionStringBuilder();
        conStringBuilder.ConnectionString = providerConnectionString;
        conStringBuilder.ConnectTimeout = 1;
        string constr = conStringBuilder.ConnectionString;

        using (SqlConnection conn = new SqlConnection(constr))
        {
            try
            {
                conn.Open();
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • @froggythefrog是的.否则它使用默认值,这太长了. (4认同)