Postgresql 实体框架连接到postgres失败:“;基础提供程序在打开时失败";
我正在本地环境中测试一个Azure函数项目,使用Npgsql作为postgres的驱动程序,连接字符串在local.settings.json而不是App.config中定义 当我将Npgsql设置为实体框架的提供程序并将默认连接工厂设置为Postgresql 实体框架连接到postgres失败:“;基础提供程序在打开时失败";,postgresql,entity-framework,azure-functions,npgsql,Postgresql,Entity Framework,Azure Functions,Npgsql,我正在本地环境中测试一个Azure函数项目,使用Npgsql作为postgres的驱动程序,连接字符串在local.settings.json而不是App.config中定义 当我将Npgsql设置为实体框架的提供程序并将默认连接工厂设置为NpgsqlConnectionFactory时,在DbContext中读取DbSet会产生以下错误: 基础提供程序在打开时失败。->建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,以及S
NpgsqlConnectionFactory
时,在DbContext
中读取DbSet
会产生以下错误:
基础提供程序在打开时失败。->建立与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。。我不熟悉.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"
请参阅此链接:
请确保它能监听所有接口或lo接口,您可以尝试“
为了确保连接性正常运行最近,由于帮助人员的激增,我重新审视了这个问题。当我意识到我忽略了DbConfiguration.SetProviderServices()时,我设法让它正常运行
来自dbconfiguration继承器。npgsql文档非常糟糕,因为它没有提到这是必需的
public class NpgSqlConfiguration : DbConfiguration
{
public NpgSqlConfiguration()
{
SetProviderFactory("Npgsql", NpgsqlFactory.Instance);
SetProviderServices("Npgsql", provider: NpgsqlServices.Instance);
SetDefaultConnectionFactory(new NpgsqlConnectionFactory());
}
}
这是我的完整副本(如果将来有人遇到类似问题):
你的数据库是在Azure中配置的吗?不是,我只是在本地主机数据库上测试。你确定你的数据库正在运行并且端口5432
是打开的吗?我检查了postgres x64服务正在运行,并在powershell中运行了netstat-an
,以确定端口状态。它具有侦听状态。另外,我应该添加,我可以访问他使用相同的连接字符串从python网站的调试测试中删除数据库。
public class NpgSqlConfiguration : DbConfiguration
{
public NpgSqlConfiguration()
{
SetProviderFactory("Npgsql", NpgsqlFactory.Instance);
SetProviderServices("Npgsql", provider: NpgsqlServices.Instance);
SetDefaultConnectionFactory(new NpgsqlConnectionFactory());
}
}