C# Entity Framework Core:无法解析服务

8 c# entity-framework-core

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

我收到错误:

尝试激活“MySql.EntityFrameworkCore.Storage.Internal.MySQLTypeMappingSource”时无法解析类型“Microsoft.EntityFrameworkCore.Storage.TypeMappingSourceDependency”的服务。

我的项目文件:

<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>
Run Code Online (Sandbox Code Playgroud)

我的数据库上下文:

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

我的用户表:

internal class DbUser
{
    [Key]
    public string? Email { get; set; }
    public string? PasswordHash { get; set; }
    public Guid UserId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 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();
Run Code Online (Sandbox Code Playgroud)

JHB*_*ius 6

<PackageReference Include="EntityFramework" Version="6.4.4" />
Run Code Online (Sandbox Code Playgroud)

这不是Entity Framework 核心,而是旧的 EF 6。您需要安装/替换它

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />
Run Code Online (Sandbox Code Playgroud)

或者你喜欢的版本。

另外,您使用的 MySql 提供程序也不是很好。您可能想切换到Pomelo


小智 5

public class MysqlEntityFrameworkDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
    {
        serviceCollection.AddEntityFrameworkMySQL();
        new EntityFrameworkRelationalDesignServicesBuilder(serviceCollection)
            .TryAddCoreServices();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在startup.cs 文件中添加另一个类,以解决此问题。

  • 关于其工作原理的来源和解释:https://bugs.mysql.com/bug.php?id=106592 (2认同)