Не удалось отправить соединение с Entity Framework: «Основной поставщик не удалось открыть» - PullRequest
0 голосов
/ 26 апреля 2018

Я тестирую проект функции Azure в локальной среде, используя Npgsql в качестве драйвера для postgres, строки подключения, определенные в local.settings.json вместо App.config.

Когда я устанавливаю Npgsql в качестве поставщика Entity Framework и устанавливаю фабрику соединений по умолчанию на NpgsqlConnectionFactory, чтение DbSet в DbContext приводит к следующей ошибке:

Основной поставщик не удалось открыть. -> При установке соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server) -> система не может найти указанный файл

Вот мой DbContext:

public partial class PostgresContext : DbContext
{
    public PostgresContext() : base("postgres-key")
    {

    }
}

public class NpgSqlConfiguration:DbConfiguration
{
    public NpgSqlConfiguration()
    {
        SetProviderFactory("Npgsql",NpgsqlFactory.Instance);
        SetDefaultConnectionFactory(new NpgsqlConnectionFactory());
    }
}

Вот моя строка подключения:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "AzureWebJobsDashboard": ""
  },
  "ConnectionStrings": {
    "postgres-key": "Server=127.0.0.1;Port=5432;Database=postgres;User Id=postgres;Password=postgres;"
  }
}

Я попытался заменить раздел «Сервер» строки подключения на localhost, проверить, работает ли служба postgres 64, проверил, открыт ли порт 5432, проверить, работает ли Entity Framework с local.settings.json.

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

Обновление: использование .net framework 4.7.1

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Я недавно вернулся к воспроизведению этой проблемы благодаря всплеску помощников. Мне удалось заставить его работать, когда этот пост переполнения стека заставил меня понять, что я исключил DbConfiguration.SetProviderServices() из наследника dbconfiguration. Документация по npgsql ужасна, поскольку в ней не упоминается, что это было необходимо.

public class NpgSqlConfiguration : DbConfiguration
{
    public NpgSqlConfiguration()
    {
        SetProviderFactory("Npgsql", NpgsqlFactory.Instance);
        SetProviderServices("Npgsql", provider: NpgsqlServices.Instance);
        SetDefaultConnectionFactory(new NpgsqlConnectionFactory());
    }
}

Вот мое полное воспроизведение (если кто-нибудь столкнется с подобной проблемой в будущем): https://bitbucket.org/DCDprivate/entityframeworkissuereproduction

0 голосов
/ 06 июля 2018

Хм .. Я не знаком с .net, однако, согласно официальному документу Npgsql, строка подключения выглядит так:

"Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase"

Пока твое есть:

"Server=127.0.0.1;Port=5432;Database=postgres;User Id=postgres;Password=postgres;"

Почему бы не использовать те же параметры? Такие как:

"Host=127.0.0.1;Username=postgres;Password=postgres;Database=postgres"

см. Ссылку: http://www.npgsql.org/doc/connection-string-parameters.html

И, пожалуйста, убедитесь, что он прослушивает все интерфейсы или интерфейс, вы можете попробовать "

telnet 127.0.0.1 5432 

чтобы убедиться, что связь работает

...