通用连接bulder

时间:2016-02-19 08:03:03

标签: c# entity-framework

我已为现有应用程序创建嵌入式监控,这些应用程序同时使用Entity FrameworkADO。我必须检查连接字符串是否良好,我实际上是这样做的:

if (c.ConnectionString.Contains("metadata"))
{
    using (var connection = new EntityConnection(c.ConnectionString))
    {
        try
        {
            connection.Open();
            isWorking = true;
            connection.Close();
        }
        catch (EntityException)
        {
            // Le catch n'a pas de raison d'être, la variable étant à false par défaut    
        }
    }
}
else
{
    using (var connection = new SqlConnection(c.ConnectionString))
    {
        try
        {
            connection.Open();
            isWorking = true;
            connection.Close();
        }
        catch (SqlException)
        {
            // Le catch n'a pas de raison d'être, la variable étant à false par défaut    
        }
    }
}

但我有很多冗余。我怎样才能开发这个东西,只有一次尝试捕获而不是Entity SQL的一个?

实际使用connections strings

检索System.Configuration.ConfigurationManager.ConnectionStrings

谢谢。

2 个答案:

答案 0 :(得分:3)

EntityConnectionSqlConnection都继承自DbConnection作为它们的共同祖先,因此您可以编写一个函数,只需要一个DbConnection实例,并将其余代码留下来相同。

public bool CheckConnection(DbConnection connection) 
{
    try
    {
        connection.Open();
        connection.Close();
        return true;
    }
    catch (Exception)
    {
        // Le catch n'a pas de raison d'être, la variable étant à false par défaut.
    }

    return false;
}

然后,您可以使用相同的逻辑调用您的代码:

if (c.ConnectionString.Contains("metadata"))
{
    using (var connection = new EntityConnection(c.ConnectionString))
    {
        isWorking = CheckConnection(connection);
    }
}
else
{
    using (var connection = new SqlConnection(c.ConnectionString))
    {
        isWorking = CheckConnection(connection);
    }
}

这只是一个简单的重构,使用您已经拥有的内容而不改变代码的逻辑。

如果您不想捕获一般异常(在我看来在这种情况下完全没问题),C#6提供了一个新的构造,以允许更一般地捕获某些异常:

catch (Exception ex) when (ex is EntityException || ex is SqlException)           
{
    // exception handling code
}

此外,如果if ... else语句中没有其他逻辑,则可以使用单个使用块:

if (c.ConnectionString.Contains("metadata"))
{
    connection = new EntityConnection(c.ConnectionString);
}
else
{
    connection = new SqlConnection(c.ConnectionString);
}

using (connection)
{
    // same as before.
}

接下来的逻辑步骤是制作某种提取和创建不同连接的工厂类/方法。

答案 1 :(得分:2)

由于两者都来自DbConnection,您可以这样做:

using(DbConnection connection = c.ConnectionString.Contains("metadata") ? 
  new EntityConnection(c.ConnectionString) as DbConnection: new SqlConnection(c.ConnectionString) as DbConnection)
{
    try
    {
        connection.Open();
        isWorking = true;
        connection.Close();
    }
    catch (Exception e) //make this more generic
    {
        //Do something
    }
}

通过使用DbConnection(而不是单独的连接),您可以测试您的连接。