使用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_
相关产品推荐
相关产品推荐

