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)
在Program
class。因此,您很可能需要将大部分代码(在 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
我第一次尝试使用 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)
在Program
class。因此,您很可能需要将大部分代码(在 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