.NET 6 - 带 EF Core 的 Web API - 生成迁移时出错

.NET 6 - WebAPI with EFCore - error generating migrations

为了演示这个问题,我使用 .NET 6 中的 webapi 模板创建了一个小项目。

尝试添加我的第一个迁移时出现以下错误(运行 详细选项);

在 class 'Program' 上未找到静态方法 'CreateHostBuilder(string[])'。 未找到应用服务提供商。 正在项目中找到 DbContext classes... 找到 DbContext 'BloggingContext'。 Microsoft.EntityFrameworkCore.Design.OperationException: 无法创建 'BloggingContext' 类型的对象。有关设计时支持的不同模式,请参阅 https://go.microsoft.com/fwlink/?linkid=851728

由于新的 .NET 6 模板在启动时没有 CreateHostBuilder,因此 EF 工具正在尝试创建上下文实例 class,但因为我在构造函数中使用 DI 来获取配置出现这个错误。

我的演示项目;


  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.11">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.11" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.1.5" />
  </ItemGroup>

</Project>

创建了一个模型 class 来保存数据库上下文和实体。

using Microsoft.EntityFrameworkCore;

namespace dotnet6apiefcore;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public IConfiguration _configuration { get; }
    public BloggingContext(IConfiguration configuration)
    {
        this._configuration = configuration;
    }
    protected override void OnConfiguring(DbContextOptionsBuilder options) {
        var connectString = _configuration.GetValue<string>("ConnectionString");
        options.UseSqlServer(connectString);
    }        
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

}

在 program.cs 我注册了 BloggingContext。

using dotnet6apiefcore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<BloggingContext>();
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

我 运行 遇到了类似的错误,但能够成功完成我的迁移。

验证您所有项目的 NuGet 包都使用相同的版本,并且由于您使用的是 .NET 6,您需要将 EF Core 包更新到最新的预发布版本。

在项目的 NuGet 包管理器中,转到 'Updates' 选项卡并确保 select 'Include prerelease'。这应该会显示一些您可以更新到的结果。

完成此操作后,我能够运行我的相同迁移命令并成功完成迁移。

注意:这仅在 .NET 6 的生产版本之前是准确的。在 .NET 6 发布后,您将需要确保您的包 运行ning 当前版本(或相应的版本与您的项目和 ef 核心 dotnet 工具)。