C# Entity Framework 核心:无法解析服务

C# Entity Framework Core: unable to resolve service

我第一次尝试使用 Entity Framework Core for C#。我的项目可以编译,但我的添加迁移没有 运行.

我收到错误:

Unable to resolve service for type 'Microsoft.EntityFrameworkCore.Storage.TypeMappingSourceDependencies' while attempting to activate 'MySql.EntityFrameworkCore.Storage.Internal.MySQLTypeMappingSource'.

我的项目文件:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="BCrypt.Net-Next" Version="4.0.2" />
    <PackageReference Include="EntityFramework" Version="6.4.4" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.1">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="MySql.EntityFrameworkCore" Version="6.0.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  </ItemGroup>
</Project>

我的 DbContext:

internal class DbModelContext : DbContext
{
    public DbSet<DbUser> Users { get; set; }    
    public DbModelContext(DbContextOptions<DbModelContext> options)
        : base(options) { }
}

我的用户table:

internal class DbUser
{
    [Key]
    public string? Email { get; set; }
    public string? PasswordHash { get; set; }
    public Guid UserId { get; set; }
}

这是我的 Program.cs(我使用的是 net6,所以我没有 startup.cs)

//Init DbConnectorClass
DatabaseConnector dbConnector = new();

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

//TODO: move to appsettings.json
var connString = "server=192.168.178.XXX;user=XXX;database=XXX;password=XXX;port=3306";

builder.Services.AddDbContext<DbModelContext>(options => options.UseMySQL(connString));
builder.Services.AddScoped<IAuthenticationHandler>(ah => new AuthenticationHandler(dbConnector));

WebApplication app = builder.Build();

app.UseSwagger();
app.UseSwaggerUI();

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

如果您正确设置了数据库,请尝试使用此命令“dotnet ef migrations add Initial” 对于更新尝试“dotnet ef 数据库更新”

im using net6 so i dont have a startup.cs

这是问题的根本原因。从 Design-time DbContext Creation 文档主题来看,即使没有明确说明,看起来也不支持“最小 API” 样式代码,因为它们仍然需要特殊方法

public static IHostBuilder CreateHostBuilder(string[] args)

Programclass。因此,您很可能需要将大部分代码(在 CreateBuilder(args).Build() 之间)移动到具有上述签名的方法中。或者使用其他在设计时创建数据库上下文的方法,例如 From a design-time factory 并以某种方式获取创建数据库上下文所需的设置。我想重构启动代码会更容易。

EF Core GitHub 问题跟踪器上有一个(已关闭?!)问题 - #3557: How to access to WebHostBuilder in Design-time DbContext Creation with top-level statements?。我在那里发布了一条评论,要求更新文档并提供“最小 API”项目的示例,并在您的问题中包含一个 link。您可以在那里观看 EF Core 团队的回应,并最终了解他们对这个主题的看法。

<PackageReference Include="EntityFramework" Version="6.4.4" />

不是Entity Framework核心,而是旧的 EF 6。 你需要 install/replace 它

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />

或您喜欢的版本。

此外,您使用的 MySql 供应商不是很好。您可能想切换到 Pomelo