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

Posted

技术标签:

【中文标题】在 .net 6 preview 7 中没有为此 DbContext 配置数据库提供程序【英文标题】:No database provider has been configured for this DbContext in .net 6 preview 7 【发布时间】:2021-08-21 23:25:03 【问题描述】:

我正在使用 .net 6,当我尝试进行迁移时,我遇到了问题:

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

我在 Stack 中阅读了另外 6 个问题,但虽然错误消息相同但解决方案不同或问题似乎相同,但我认为问题与 .net 6 preview 7 有关,请帮我找到解决方案。

我有 3 个项目

Jupyter.Core.Api -> 有 DbConfiguration

Jupyter.Core.Data -> 有 DbContext

Jupyter.Core -> 有 1 个模型

Jupyter.Core.Api 引用 Jupyter.Core.Data

Jupyter.Core.Data 引用 Jupyter.Core

在 Jupyter.Core.Api 我有以下与问题相关的 PackageReference:

<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.9">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Npgsql" Version="5.0.7" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.7" />

在 Jupyter.Core.Data 我有以下与问题相关的 PackageReference:

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0-preview.7.21378.4" />

在Program.cs里面的Jupyter.Core.Api我的代码是这样的,.net 6模板中没有Startup.cs

using Jupyter.Core.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

builder.Services.AddDbContext<StationContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("StationConnection")));

builder.Services.AddSwaggerGen(c =>

    c.SwaggerDoc("v1", new()  Title = "Juptyer.Core.Api", Version = "v1" );
);

var app = builder.Build();

// Configure the HTTP request pipeline.
if (builder.Environment.IsDevelopment())

    app.UseDeveloperExceptionPage();
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Juptyer.Core.Api v1"));


app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

而在 Jupyter.Core.Data 中的 StationContext.cs 是这样的。

using System;
using Jupyter.Core.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;

#nullable disable

namespace Jupyter.Core.Data;

public partial class StationContext : DbContext

    public StationContext()  

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

    protected override void OnConfiguring(DbContextOptionsBuilder opitionsBuilder)
    
        base.OnConfiguring(opitionsBuilder);
    

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.HasAnnotation("Relational:Collation", "en_US.utf8");

        OnModelCreatingPartial(modelBuilder);
    

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);

    public DbSet<User> Users  get; set; 

我使用 Visual Studio,我在包控制台中尝试了休闲命令。

添加迁移“用户”-Context StationContext

我的默认启动项目设置为 Jupyter.Core.Api,包内控制台设置为 Jupyter.Core.Data。

消息说,没有为此DbContext配置数据库提供程序,但我在Program.cs中做了

builder.Services.AddDbContext<StationContext>(options => 
    options.UseNpgsql(builder.Configuration.GetConnectionString("StationConnection")));

它还谈到“如果使用 'AddDbContext',那么还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象并将其传递给 DbContext 的基本构造函数。”我也这样做了。

protected override void OnConfiguring(DbContextOptionsBuilder opitionsBuilder)

    base.OnConfiguring(opitionsBuilder);

我也知道 DbContext 类应该有这样的构造器。

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

那么,我错过了什么?有什么提示吗?

【问题讨论】:

【参考方案1】:

好吧,我花了几个小时试图找到一个解决方案,在我在这里发布问题后尝试了 40 分钟后,我明白了为什么它不起作用。

代码中的一切都是正确的,但是 PackageReference 不正确。

在 Jupyter.Core.Api 而不是这个

<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.9">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Npgsql" Version="5.0.7" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.7" />

应该是这样的

<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0-preview.7.21378.4">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.0-preview7" />

在 Jupyter.Core.Data 而不是这个

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0-preview.7.21378.4" />

应该是这样的

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0-preview.7.21378.4" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.0-preview7" />

这解决了我的问题。

【讨论】:

以上是关于在 .net 6 preview 7 中没有为此 DbContext 配置数据库提供程序的主要内容,如果未能解决你的问题,请参考以下文章

.NET 6 Preview 6 Released

如何使用 .NET MAUI Preview 7 创建 DataGrid?

Visual Studio 2022 Preview 1 和.NET 6 Preview 5 正式发布

Visual Studio 2022 Preview 1 和.NET 6 Preview 5 正式发布

.NET 6 Preview 6 现已推出,其中包括对 ASP.NET Core 的许多重大改进。

.NET 6 Preview 6 现已推出,其中包括对 ASP.NET Core 的许多重大改进。