Проверьте, не связан ли Entity Framework с чем-либо - PullRequest
27 голосов
/ 22 февраля 2011

Когда вы создаете новый объект EntityCollection, соединение не пытается открыть базу данных, пока вы не попытаетесь что-то сделать с этой коллекцией.Мне нужно определить, имеет ли коллекция Entity действительное соединение или нет, и я не могу найти эффективный способ сделать это.

В настоящее время у меня есть это в моем коде:

var db = new MyEntityCollection();

try
{
     var checkworking = from c in db.Customers select c;
}
catch 
{ 
     ConnectToBackUp();
}

Это не только ужасный код, но и очень медленный, поскольку он ожидает возраст, чтобы определить, активно ли соединение, прежде чем выдавать исключение.

Я знаю, что могу контролировать, как долго он ждет досдаться с помощью ConnectionTimeout, но это еще один уродливый хак, который усугубляет плохую ситуацию.

Конечно, есть лучший способ сделать это?

Ответы [ 6 ]

31 голосов
/ 21 июня 2012

Простейшее:

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;
    }
}

Обновление для 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;
        }
    }
}
11 голосов
/ 22 февраля 2011

Вы просто хотите посмотреть, правильно ли установлено соединение с БД.Если это так, взгляните на objectcontext.databaseExists().

8 голосов
/ 23 февраля 2011

Решил это, немного обойдя дома и построив новую строку подключения для тестирования с 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;
            }
        }
    }
1 голос
/ 22 февраля 2011

Разве такая инфраструктура не должна предоставляться на уровне сети или сервера базы данных? Ручная обработка соединения с резервным сервером выглядит странно. Более того, это невозможно без ожидания тайм-аута, поскольку сначала необходимо попытаться открыть соединение с основным сервером.

Само соединение доступно на ObjectContext.Connection. Это свойство должно возвращать EntityConnection экземпляр, который содержит StoreConnection свойство, содержащее соединение с реальной БД. Вы можете проверить состояние этого соединения.

0 голосов
/ 14 марта 2018

Я сделал метод расширения для использования с EntityFramework Core.

Вот код:

using Microsoft.EntityFrameworkCore;
using System.Data.Common;

namespace TerminalInventory
{
    public static class ExtensionMethods
    {
        public static bool TestConnection(this DbContext context)
        {
            DbConnection conn = context.Database.GetDbConnection();

            try
            {
                conn.Open();   // Check the database connection

                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

Теперь вам просто нужно позвонить:

if (!context.TestConnection())
{
    logger.LogInformation("No database connection. Check the connection string in settings.json. {0}", configuration["connectionString"]);

    return;
}
0 голосов
/ 26 января 2015

В моем приложении пользователь может изменить соединение с базой данных из пользовательского интерфейса. Я использую этот код для быстрой проверки соединения с новыми данными соединения:

    public bool CheckAvailable(string sqlServerName, string login, string password)
    {
        var testConnectionString = GetConnectionString(sqlServerName, login, password);

        if (string.IsNullOrWhiteSpace(testConnectionString))
            return false;

        var result = false;

        try
        {
            var testContext = new EntityContext(testConnectionString);

            result = testContext.Database.Exists();
        }
        catch (Exception ex)
        {
            log.Error(exception);
        }

        return result;
    }


    private string GetConnectionString(string sqlServerName, string login, string password)
    {
        var sqlConnectionString = new SqlConnectionStringBuilder
                                 {
                                     DataSource = sqlServerName,
                                     InitialCatalog = ConfigurationProvider.DatabaseName,
                                     UserID = login,
                                     Password = password,
                                     MultipleActiveResultSets = true,
                                     ConnectTimeout = 2 // in seconds
                                 };

        var efConnectionString = new EntityConnectionStringBuilder
                                 {
                                     Provider = ProviderName,
                                     Metadata = ConnectionMetadata,
                                     ProviderConnectionString = sqlConnectionString.ToString()
                                 };

        return efConnectionString.ConnectionString;
    }

ConnectTimeout свойство типа SqlConnectionStringBuilder очень важно для быстрой проверки молнии. Если вы знаете, что ваша база данных должна быть доступна и должна быстро реагировать, вы можете установить это значение равным 1 (при установленном локальном сервере SQL проверка занимает 100-200 миллисекунд). Не устанавливайте 0, потому что это означает отсутствие предела и его следует избегать в строках соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...