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

使用Npgsql EF Core 9.x时因缺失GetDatabaseLock方法无法创建DbContext

解决EF Core 9.x + Npgsql 9.x迁移时GetDatabaseLock未实现的错误

问题描述

使用ASP.NET Core + Entity Framework Core 9.x + Npgsql 9.x连接PostgreSQL时,执行迁移或启动应用触发以下错误:

无法创建类型为'RuntimeType'的'DbContext'。创建实例时引发异常:程序集Npgsql.EntityFrameworkCore.PostgreSQL, Version=9.0.0.0中的类型Npgsql.EntityFrameworkCore.PostgreSQL.Migrations.Internal.NpgsqlHistoryRepository的方法'GetDatabaseLock'未实现。

已确认所有EF Core和Npgsql包为9.x版本,降级到7.x可解决问题,但需保留9.x特性。


解决方案

1. 精确匹配EF Core与Npgsql的预览版本

EF Core 9.x处于预览阶段,Npgsql.EntityFrameworkCore.PostgreSQL的预览版本必须与EF Core相关包完全版本一致,不能仅保证主版本为9.x:

  • 确保Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Design、Microsoft.EntityFrameworkCore.Tools和Npgsql.EntityFrameworkCore.PostgreSQL的版本号完全相同(例如均为9.0.0-preview.7.24401.12)

2. 改用设计时工厂创建DbContext

若DbContext通过依赖注入外的方式实例化(如直接new),易引发版本兼容问题。实现IDesignTimeDbContextFactory类统一创建逻辑:

public class YourDbContextFactory : IDesignTimeDbContextFactory<YourDbContext>
{
    public YourDbContext CreateDbContext(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();

        var options = new DbContextOptionsBuilder<YourDbContext>();
        options.UseNpgsql(config.GetConnectionString("DefaultConnection"));

        return new YourDbContext(options.Options);
    }
}

执行迁移时,EF会自动调用该工厂创建DbContext,规避RuntimeType实例化异常。

3. 彻底清理项目依赖残留

  • 删除项目根目录下的bin和obj文件夹,清除编译产物
  • 卸载所有EF Core和Npgsql相关NuGet包,重新安装版本完全匹配的预览包
  • 检查.csproj文件,移除残留的旧版本包引用,确保所有相关包版本统一

4. 验证PostgreSQL服务器版本兼容性

Npgsql 9.x对PostgreSQL服务器版本有更高要求,确保服务器版本为12.x及以上。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:32:35