初始数据库迁移:没有为此 DbContext 配置数据库提供程序

Posted

技术标签:

【中文标题】初始数据库迁移:没有为此 DbContext 配置数据库提供程序【英文标题】:Initial db migration: No database provider has been configured for this DbContext 【发布时间】:2021-03-18 15:59:12 【问题描述】:

我有以下 DbContext 类:

public class BingoMasterDbContext : DbContext

    public DbSet<User> Users  get; set; 
    public DbSet<Player> Players  get; set; 
    public DbSet<Game> Games  get; set; 

    public BingoMasterDbContext()  

    public BingoMasterDbContext(DbContextOptions<BingoMasterDbContext> options) : base(options)
    
    

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity<User>()
            .HasOne(user => user.Player)
            .WithOne(player => player.User)
            .HasForeignKey<Player>(player => player.UserId);
    

我在 StartUp.cs 的 ConfigureServices 方法中注册了 DbContext,并将连接字符串添加到 appsettings.json

services.AddControllers();
services.AddDbContext<BingoMasterDbContext>(
    options => options.UseSqlServer(Configuration.GetConnectionString("Database")));

我尝试使用 EF 核心命令 dotnet ef migrations add InitialCreate 创建初始迁移 这导致了以下错误:

没有为此 DbContext 配置数据库提供程序。可以通过重写 DbContext.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用了 AddDbContext,那么还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象并将其传递给 DbContext 的基本构造函数。

错误消息指出我应该注册 DbContext 并在我的构造函数中添加一个 DbContextOptions 对象并将其传递给基本构造函数。我做了所有这些,但不幸的是没有运气。 我无法弄清楚我做错了什么。

【问题讨论】:

删除无参数构造函数(public BingoMasterDbContext() ),问题就解决了。异常消息表明由于某种原因使用了构造函数,当然那里没有配置数据库提供程序。这么写,构造函数反正也没用。 【参考方案1】:

问题是我从 DbContext 所在的实体项目中运行了添加迁移命令,但 DbContext 本身仅在我的 Startup.cs 所在的 API 项目中注册和创建。以下命令成功了:

dotnet ef migrations add MigrationName -s mainProject -p DbContextProject

查看Github issue了解更多详情

【讨论】:

以上是关于初始数据库迁移:没有为此 DbContext 配置数据库提供程序的主要内容,如果未能解决你的问题,请参考以下文章

在 .net 6 preview 7 中没有为此 DbContext 配置数据库提供程序

DotNet Core,没有为此 DbContext 配置数据库提供程序

从迁移中排除 DbContext 以避免 Context-Parameter

EFCore高级Saas系统下单DbContext如何支持不同数据库的迁移

起订量和设置数据库上下文

我应该如何编写转换数据的实体框架迁移(最好使用 DbContext)?