Entity Framework 连接到 postgres 失败:"The underlying provider failed on Open"
Entity Framework connection failed to postgres: "The underlying provider failed on Open"
我正在本地环境中测试 Azure 函数项目,使用 Npgsql 作为 postgres 的驱动程序,连接字符串定义在 local.settings.json 而不是 App.config 中。
当我将 Npgsql 设置为 Entity Framework 的提供程序并将默认连接工厂设置为 NpgsqlConnectionFactory
时,读取 DbContext
中的 DbSet
会产生以下错误:
The underlying provider failed on Open. -> A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) -> The system cannot find the file specified
这是我的 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;"
}
}
我尝试用本地主机替换连接字符串的服务器部分,检查 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"
参考这个link:http://www.npgsql.org/doc/connection-string-parameters.html
请确保它监听所有接口或lo接口,你可以试试
telnet 127.0.0.1 5432
确保连接正常
由于最近帮手的激增,我重新审视了我对问题的再现。当 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
我正在本地环境中测试 Azure 函数项目,使用 Npgsql 作为 postgres 的驱动程序,连接字符串定义在 local.settings.json 而不是 App.config 中。
当我将 Npgsql 设置为 Entity Framework 的提供程序并将默认连接工厂设置为 NpgsqlConnectionFactory
时,读取 DbContext
中的 DbSet
会产生以下错误:
The underlying provider failed on Open. -> A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) -> The system cannot find the file specified
这是我的 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;"
}
}
我尝试用本地主机替换连接字符串的服务器部分,检查 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"
参考这个link:http://www.npgsql.org/doc/connection-string-parameters.html
请确保它监听所有接口或lo接口,你可以试试
telnet 127.0.0.1 5432
确保连接正常
由于最近帮手的激增,我重新审视了我对问题的再现。当 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