为啥脚手架没有按预期工作?
Posted
技术标签:
【中文标题】为啥脚手架没有按预期工作?【英文标题】:Why doesn't scaffolding work as expected?为什么脚手架没有按预期工作? 【发布时间】:2020-03-08 13:57:15 【问题描述】:我正在尝试搭建脚手架,但出现以下错误:
运行所选代码生成器时出错:'没有为类型'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
的基本构造函数。
微软也是如此。他们正在使用实体框架构建带有视图的 MVC 控制器。他们没有在 MvcMovieCONtext 类中添加第二个构造函数就这样做了。他们的 MvcMovieContextClass 对应于我的 MvcProductContext 类。
任何帮助将不胜感激。
【问题讨论】:
你需要无参数的构造函数。您还需要在应用程序配置中包含对连接字符串的引用 @Glenn Ferrie 好的,但微软为什么不在他们的示例中包含无参数构造函数?此外,当我在 MvcProductContext 中已有的构造函数下方添加一个无参数构造函数时,我收到了另一个错误,该错误已在帖子中。关于包含对连接字符串的引用,我认为我是在 ConfigureServices 方法的 startup.cs 文件中这样做的?我已使用 Startup.cs 文件中的代码更新了原始帖子。 这看起来应该可以了,你安装了什么版本的.net core sdk? (在 cmd 行运行:dotnet --info)。与 Microsoft 示例中使用的版本相同吗? 我无法重现该问题。它仅在您忘记注册 dbcontext 但您已从代码中添加时出现。您可以在全新的 mvc 项目中尝试吗? @Andrew 我有版本:3.0.100。在 Visual Studio 2019 中,我选择了 3.0 作为项目版本,并且我也选择了 Microsoft guide to 3.0。 【参考方案1】:只需在您的项目中添加一个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);
【讨论】:
以上是关于为啥脚手架没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章