[英]C# Entity Framework Core: unable to resolve service
我第一次尝试将 Entity Framework Core 用于 C#。 我的项目确实编译了,但我的添加迁移没有运行。
我得到错误:
尝试激活“MySql.EntityFrameworkCore.Storage.Internal.MySQLTypeMappingSource”时无法解析“Microsoft.EntityFrameworkCore.Storage.TypeMappingSourceDependencies”类型的服务。
我的项目文件:
<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>
我的数据库上下文:
internal class DbModelContext : DbContext
{
public DbSet<DbUser> Users { get; set; }
public DbModelContext(DbContextOptions<DbModelContext> options)
: base(options) { }
}
我的用户表:
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 database update”
"我使用net6,所以我没有startup.cs
<\/blockquote>这是问题的根本原因。 从设计时 DbContext 创建<\/a>文档主题,即使没有明确说明,看起来也不支持“最小 API”样式代码,因为它们仍然需要特殊方法
在
或者使用其他在设计时创建数据库上下文的方法,例如从设计时工厂<\/a>并以某种方式获取创建数据库上下文所需的设置。 我想重构启动代码会更容易。Program<\/code>类中。
因此,您很可能需要将大部分代码(在
CreateBuilder(args)<\/code>和
.Build()<\/code>之间)移动到具有上述签名的方法中。
EF Core GitHub 问题跟踪器上有一个(已关闭?!)问题 - #3557:如何使用顶级语句在设计时 DbContext 创建中访问 WebHostBuilder?<\/a> . 我在那里发表了一条评论,要求更新文档并提供“最小 API”项目的示例,并包含指向您问题的链接。 您可以在那里观看 EF Core 团队的回复,并最终了解他们对该主题的看法。
<PackageReference Include="EntityFramework" Version="6.4.4" />
public class MysqlEntityFrameworkDesignTimeServices : IDesignTimeServices
{
public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
{
serviceCollection.AddEntityFrameworkMySQL();
new EntityFrameworkRelationalDesignServicesBuilder(serviceCollection)
.TryAddCoreServices();
}
}
您可以在 startup.cs 文件中添加另一个 class 以解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.