我正在构建一个.NET API,但在使用EFCore和Npgsql创建postgres数据库时被卡住了。
目标框架:.Net Core 3.1 EFCore 3.1.4 Npgsql 3.1.3。
我已经创建了初始迁移,但随后运行dotnet ef数据库更新给我这个错误。
Npgsql.NpgsqlException (0x80004005): No password has been provided but the backend requires one (in MD5)
at Npgsql.NpgsqlConnector.AuthenticateMD5(String username, Byte[] salt, Boolean async)
at Npgsql.NpgsqlConnector.Authenticate(String username, NpgsqlTimeout timeout, Boolean async)
at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnection.<>c__DisplayClass32_0.<<Open>g__OpenLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Npgsql.NpgsqlConnection.Open()
at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists()
at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
我发现有很多人也有同样的错误,但是没有一个建议的解决方案对我有效,最常见的是说我需要在我的连接字符串中添加Persist Security Info=true;,因为这是.NET Core 3.1中新增加的一个安全功能。
我目前的连接字符串是。
"ConnectionStrings": {
"(default)": "Server=localhost; Port=5432; Database=xxxxx; Persist Security Info=true; Pooling=true; CommandTimeout=60;"
},
我也试过添加密码=xxxxx;到连接字符串,因为有人建议这样做。
有谁能帮忙吗?
private static string Host = "mydemoserver.postgres.database.azure.com";
private static string User = "mylogin@mydemoserver";
private static string DBname = "mypgsqldb";
private static string Password = "<server_admin_password>";
private static string Port = "5432";
static void Main(string[] args)
{
// Build connection string using parameters from portal
//
string connString =
String.Format(
"Server={0};Username={1};Database={2};Port={3};Password={4};SSLMode=Prefer",
Host,
User,
DBname,
Port,
Password);
}