我正在尝试脚手架,但出现以下错误:
运行所选代码生成器时发生错误:“未为类型'MvcProduct.Data.MvcProductContext'定义无参数构造函数。'
在这里您可以看到它的图像:
以下是我的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; }
}
和
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
文件中的Startup.cs
方法:public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<MvcProductContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MvcProductContext")));
}
我还尝试在
MvcProductContext
类中添加第二个构造函数。 (我想避免但又不想做的事情)没有任何参数的第二个构造函数。但是,如果我这样做,我只会得到另一个错误,它指出:运行所选代码生成器时发生错误:'尚未为此DbContext配置数据库提供程序。可以通过覆盖
DbContext.OnConfiguring
方法或通过在应用程序服务提供程序上使用AddDbContext
来配置提供程序。如果在应用程序服务提供商上为AddDbContext
。如果使用AddDbContext
,则还要确保您的DbCotnext
类型在其构造函数中接受DbContextOptions<TContext>
对象,并将其传递给DbContext
的基本构造函数。微软也是一样。他们正在使用Entity Framework为MVC控制器提供视图。他们这样做的时候没有在其MvcMovieCOntext类中添加第二个构造函数。他们的MvcMovieContextClass对应于我的MvcProductContext类。
任何帮助,将不胜感激。
最佳答案
只需在您的项目中添加IDesignTimeDbContextFactory实现,然后再次尝试使用脚手架即可。它将实例化您的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);
}
}