为啥脚手架没有按预期工作?

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&lt;TContext&gt; 对象并将其传递给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);
    

【讨论】:

以上是关于为啥脚手架没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 SUM() 字段没有按预期工作?

为啥响应式表没有按预期工作?

为啥我的替换没有按预期工作[重复]

为啥我的查询没有按预期工作?

为啥我的 javascript 代码没有按预期工作

为啥我的应用程序不使用脚手架的身份页面?