实体框架连接无法postgres:“基础提供程序在打开时失败”

时间:2018-04-26 11:19:20

标签: postgresql entity-framework azure-functions npgsql

我正在本地环境中测试Azure函数项目,使用Npgsql作为postgres的驱动程序,在local.settings.json中定义的连接字符串而不是App.config。

当我将Npgsql设置为Entity Framework的提供程序并将默认连接工厂设置为NpgsqlConnectionFactory时,读取DbSet中的DbContext会产生以下错误:

  

底层提供程序在Open上失败。 - >建立与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替换连接字符串的Server部分,检查postgres 64服务是否正在运行,检查端口5432是否打开,检查Entity Framework是否与local.settings.json一起使用。

我能够继续前进的唯一方法是为手动数据库查询创建自己的NpgsqlConnection。我试图尽可能地避免计划B,并感谢任何帮助ORM工作。

更新:使用.net framework 4.7.1

2 个答案:

答案 0 :(得分:1)

嗯。我不熟悉.net,但是,根据Npgsql的官方文档,连接字符串如下所示:

myTableView.estimatedRowHeight = 100.0
myTableView.rowHeight = UITableViewAutomaticDimension

您的是:

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

为什么不使用相同的参数?如:

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

请参阅以下链接:http://www.npgsql.org/doc/connection-string-parameters.html

请确保它在所有接口或lo接口上侦听,您可以尝试“

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

确保连接正常

答案 1 :(得分:0)

由于最近佣工的激增,我重新审视了这个问题。当this stack overflow post使我意识到,我已经从dbconfiguration继承程序中省略了DbConfiguration.SetProviderServices()时,我设法使其工作。 npgsql文档很糟糕,因为它没有提到这是必需的。

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

这是我的完整复制本(如果将来有人遇到类似问题): https://bitbucket.org/DCDprivate/entityframeworkissuereproduction