Я смотрю видео на GraphQL (мин. 1.28.22), и когда я запускаю команду «dotnet efmigrations add AddPlatformToDb», она возвращает следующую проблему:
Невозможно создать «DbContext» типа «». Исключение «Невозможно разрешить службу для типа Microsoft.EntityFrameworkCore.DbContextOptions`1[CommanderGQL.Data.AppDbContext]» при попытке активировать «CommanderGQL.Data.AppDbContext». был выброшен при попытке создать экземпляр. Информацию о различных шаблонах, поддерживаемых во время разработки, см. https://go.microsoft.com/fwlink/?linkid=851728
Несмотря на то, что написано одно и то же, в видео это не создает никаких проблем.
CommanderGQL.csproj:
<Project Sdk = "Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include = "GraphQL.Server.Ui.Voyager" Version = "7.7.1" />
<PackageReference Include = "HotChocolate.AspNetCore" Version = "13.9.0" />
<PackageReference Include = "HotChocolate.Data.Entityframework" Version = "13.9.0" />
<PackageReference Include = "Microsoft.EntityframeworkCore.Design" Version = "8.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include = "Microsoft.EntityframeworkCore.SqlServer" Version = "8.0.2" />
</ItemGroup>
</Project>
docker-compose.yaml:
version: '3'
services:
sqlserver:
image: "mcr.microsoft.com/mssql/server:2017-latest"
environment:
ACCEPT_EULA: "Y"
SA_PASSWORD: "pa55w0rd!"
MSSQL_PID: "Express"
ports:
- "1433:1433"
appsettings.Development.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"CommandConStr" : "Server=localhost,1433;Database=CommandsDB;User Id=sa;Password=pa55w0rd!"
}
}
appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Startup.cs:
using CommanderGQL.Data;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace CommanderGQL
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
//public IConfiguration Configuration { get; }
private readonly IConfiguration Configuration;
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(opt => opt.UseSqlServer
(Configuration.GetConnectionString("CommandConStr")));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// Configure production environment here
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// Configure endpoints here
});
}
}
}
Platform.cs:
using System.ComponentModel.DataAnnotations;
namespace CommanderGQL.Models
{
public class Platform
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string LicenseKey { get; set; }
}
}
AppDbContext.cs:
using CommanderGQL.Models;
using Microsoft.EntityFrameworkCore;
namespace CommanderGQL.Data
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<Platform> Platforms { get; set; }
}
}
Program.cs:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();





Вы создали приложение, используя «новую» (начиная с .NET 6) минимальную модель хостинга (которая используется начиная с шаблонов .NET 6). По сути, у вас есть 2 варианта:
Удалите Startup.cs и переместите его содержимое в файл Program.cs, все из ConfigureServices должно вызываться builder.Services (вместо services), а все из Configure должно вызываться app (возможно, мне следует внести некоторые изменения):
builder.Services.AddDbContext<AppDbContext>(opt => opt.UseSqlServer
(builder.Configuration.GetConnectionString("CommandConStr")));
// ...
app.UseDeveloperExceptionPage();
Перепишите свое приложение и вернитесь к универсальному хостингу, который может использовать Startup
Без этих изменений ваш код в Startup не будет применен, поэтому контекст для миграции настроен неправильно.
Смотрите также: