.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 工具)。
为了演示这个问题,我使用 .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 工具)。