I'm following a video on GraphQL (min 1.28.22), and when I run the command "dotnet ef migrations add AddPlatformToDb", it returns the following issue:
Unable to create a 'DbContext' of type ''. The exception 'Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[CommanderGQL.Data.AppDbContext]' while attempting to activate 'CommanderGQL.Data.AppDbContext'.' was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
Despite writing the same things, it doesn't create any issues in the video.
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();
You have created an application using "new" (since .NET 6) minimal hosting model (which is used since .NET 6 templates). You basically have 2 options:
Remove the
Startup.csand move it contents toProgram.csfile, everything fromConfigureServicesshould be called onbuilder.Services(instead ofservices), and everything fromConfigureshould be called onapp(possibly some modifications should me made):Rewrite your app and switch back to the generic hosting which can use the
StartupWithout this changes your code in
Startupis not applied, so the context is not set up correctly for migrations.See also: