'Why doesn't scaffolding work as expected?

I am trying to scaffold and I get the following error:

There was an error running the selected code generator: 'No parameterless constructor defined for type 'MvcProduct.Data.MvcProductContext'.'

Here you can see an image of it: Error when scaffolding

The following is my MvcProductContext:

using Microsoft.EntityFrameworkCore;
using MvcProduct.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MvcProduct.Data
{
    public class MvcProductContext : DbContext
    {
        public MvcProductContext(DbContextOptions<MvcProductContext> options)
            : base(options)
        {
        }

        public DbSet<Product> Product { get; set; }
    } 

And the appsettings.json:

 {
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MvcProductContext": "Server=(localdb)\\mssqllocaldb;Database=MvcProductContext-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }

ConfigureServices method in Startup.cs file:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<MvcProductContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("MvcProductContext")));
}

I have also tried to add a a second constructor in MvcProductContext class. (Something which I would like to avoid and don't want to do) A second contructor without any parameter. But if I do that I just get another error which says:

There was an error running the selected code generator: 'No database provider has been configured for this DbContext. A provider can be configured bu overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbCotnext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.

Microsoft is does the same. They are scaffolding an MVC controller with views, using Entity Framework. They are doing it without adding a second constructor in their MvcMovieCOntext class. Their MvcMovieContextClass corresponds to my MvcProductContext class.

Any help would be appreciated.



Solution 1:[1]

Just add a IDesignTimeDbContextFactory implementation to your project and try scaffolding again. It will take care of instantiating your DbContext.

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MvcProductContext>
{
    public MvcProductContext CreateDbContext(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appSettings.json")
            .Build();
        var builder = new DbContextOptionsBuilder<MvcProductContext>();
        var connectionString = configuration.GetConnectionString("MvcProductContext");
        builder.UseSqlServer(connectionString);
        return new MvcProductContext(builder.Options);
    }
}

Solution 2:[2]

In .net core 6 :

  • Install 4 packages:

1.Microsoft.EntityFrameworkCore.SqlServer

2.Microsoft.EntityFrameworkCore.Tools

3.Microsoft.EntityFrameworkCore.Design

4.Microsoft.VisualStudio.Web.CodeGeneration.Design

  • Scaffold the data base and create the DbContext and Entities by scaffold command or ef core power tools vs extension.

  • Inject your data base settings in program.cs :

    builder.Services.AddRazorPages();

      builder.Services.AddDbContext<AppDbContext>(options =>
      {
          options.UseSqlServer(builder.Configuration.GetConnectionString("CS"));
      });
    
  • Add your connection string to appsettings.json :

    "AllowedHosts": "*",

      "ConnectionStrings": {
    
      "CS": "Data Source=.\\SQLEXPRESS;Initial Catalog=Db1;Integrated Security=True;MultipleActiveResultSets=True"
        }
    

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dmitry Pavlov
Solution 2 M Komaei