EF Core DbContext配置test数据库,执行Migrate却报postgres不存在
问题分析与解决
你的问题核心是:EF Core执行Migrate()时,若目标数据库(test)尚未创建,Npgsql会默认尝试连接到与用户名同名的数据库(这里是postgres)完成初始化操作,但该数据库不存在,因此抛出错误。
解决方法
方法1:手动提前创建test数据库
通过PostgreSQL客户端(如pgAdmin、psql命令行)连接到服务器,执行创建数据库的SQL:
CREATE DATABASE test;
完成后再运行控制台项目,Migrate()即可正常执行。
方法2:代码中自动创建目标数据库(推荐)
可以在执行迁移前,先检查并创建目标数据库:
static void Main(string[] args) { // 先验证并创建test数据库 var adminConnStr = "Host=myip;Username=postgres;Password=postgres"; using (var adminConn = new NpgsqlConnection(adminConnStr)) { adminConn.Open(); using (var cmd = adminConn.CreateCommand()) { // 检查数据库是否存在 cmd.CommandText = "SELECT 1 FROM pg_database WHERE datname = 'test'"; if (cmd.ExecuteScalar() == null) { cmd.CommandText = "CREATE DATABASE test"; cmd.ExecuteNonQuery(); } } } // 执行迁移 DbContextMain dbContextMain = new(); dbContextMain.Database.Migrate(); }
也可以把数据库创建逻辑整合到DbContext的OnConfiguring方法中:
public class DbContextMain: DbContext { // 你的DbSet定义 public DbContextMain(): base() { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var targetConnStr = "Host=myip;Username=postgres;Password=postgres;Database=test"; optionsBuilder.UseNpgsql(targetConnStr); // 检查并创建目标数据库 var adminConnStr = "Host=myip;Username=postgres;Password=postgres"; using (var adminConn = new NpgsqlConnection(adminConnStr)) { adminConn.Open(); using (var cmd = adminConn.CreateCommand()) { cmd.CommandText = "SELECT 1 FROM pg_database WHERE datname = 'test'"; if (cmd.ExecuteScalar() == null) { cmd.CommandText = "CREATE DATABASE test"; cmd.ExecuteNonQuery(); } } } } }
关键原因说明
调用Database.Migrate()时,EF Core需要连接数据库读取迁移历史表。若目标数据库(test)不存在,Npgsql驱动会自动忽略连接字符串中的Database参数,尝试连接与当前用户名(postgres)同名的数据库,而该数据库在你的服务器上不存在,因此抛出3D000: database "postgres" does not exist错误。
内容的提问来源于stack exchange,提问作者user149691
相关产品推荐
相关产品推荐

