初始数据库迁移:没有为此 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