You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EF Core执行迁移时无法创建ApplicationDbContext对象的问题

EF Core执行dotnet ef database update报错:Unable to create an object of type 'ApplicationDbContext' 及 Host can't be null

执行dotnet ef migrations add init --verbose生成迁移后,运行dotnet ef database update时先后出现两个错误:

  • Unable to create an object of type 'ApplicationDbContext'
  • 后续调试中触发Host can't be null的Npgsql连接异常

两种尝试的实现方案

第一种实现

using System;
using System.Collections.Generic;
using Audit.Service.Domain.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace Audit.Service.Infrastructure.Repositories
{
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions options) : base(options) { }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseNpgsql("Server = localhost; Port = 5432; User Id = postgres; Password =; Database = AuditHistory; ");
        }

        public DbSet<AuditHistory> Audits => Set<AuditHistory>();
    }
}

第二种实现

Program.cs 配置

builder.Services.AddDbContext<ApplicationDbContext>(o => o.UseNpgsql(builder.Configuration.GetConnectionString("auditDb"), options => options.EnableRetryOnFailure())) 

ApplicationDbContext 代码

public class ApplicationDbContext : DbContext
{
    protected readonly IConfiguration Configuration;
    public ApplicationDbContext()
    {
    }

    public ApplicationDbContext(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseNpgsql(Configuration.GetConnectionString("auditDb"));
    }
    public DbSet<AuditHistory> Audits { get; set; }
}

appsettings.json 配置

{
 "Logging": {
"LogLevel": {
  "Default": "Information",
  "Microsoft.AspNetCore": "Warning"
  }
 },
 "AllowedHosts": "*",
 "ConnectionStrings": {
    "auditDb":"Server=localhost;Port=5432;User Id=postgres;Password=;Database=AuditHistory;"
 }
}

最终错误栈

System.ArgumentException: Host can't be null
 at Npgsql.NpgsqlConnectionStringBuilder.PostProcessAndValidate()
   at Npgsql.NpgsqlConnection.SetupDataSource()
   at Npgsql.NpgsqlConnection.set_ConnectionString(String value)
   at Npgsql.NpgsqlConnection..ctor(String connectionString)
   at Npgsql.NpgsqlConnection.CloneWith(String connectionString)
   at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlRelationalConnection.CloneWith(String connectionString)
   at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists(Boolean async, CancellationToken cancellationToken)
   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 connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Host can't be null

解决方案

1. 修复DbContext构造与配置逻辑

问题核心是EF Core工具无法正确初始化ApplicationDbContext,同时连接字符串读取异常导致Host解析为空。按以下方式修改:

  • 重写ApplicationDbContext:保留强类型的DI构造函数,移除无参构造和OnConfiguring硬编码,完全依赖DI容器注入配置:
using Audit.Service.Domain.Entities;
using Microsoft.EntityFrameworkCore;

namespace Audit.Service.Infrastructure.Repositories
{
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
            : base(options) { }

        public DbSet<AuditHistory> Audits => Set<AuditHistory>();
    }
}
  • 确保Program.cs注册逻辑正确:
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseNpgsql(
        builder.Configuration.GetConnectionString("auditDb"),
        npgsqlOptions => npgsqlOptions.EnableRetryOnFailure()
    )
);

2. 确保EF工具能访问配置文件

如果DbContext在类库中,执行命令时必须指定启动项目(需包含appsettings.json):

dotnet ef database update --project 你的DbContext项目名 --startup-project 你的WebApi项目名 --verbose

3. 验证连接字符串格式

检查appsettings.json中的连接字符串,避免键值对间多余空格:

"ConnectionStrings": {
    "auditDb": "Server=localhost;Port=5432;User Id=postgres;Password=;Database=AuditHistory;"
}

4. 测试配置读取有效性

在启动项目中添加验证代码,确认连接字符串能被正确读取:

var connString = builder.Configuration.GetConnectionString("auditDb");
Console.WriteLine($"读取到的连接字符串: {connString}");

内容的提问来源于stack exchange,提问作者Nismath_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:02:43