Asp.net mvc 实体框架核心错误:未为此对象定义无参数构造函数

Asp.net mvc 实体框架核心错误:未为此对象定义无参数构造函数,asp.net-mvc,asp.net-core,visual-studio-2017,entity-framework-core,Asp.net Mvc,Asp.net Core,Visual Studio 2017,Entity Framework Core,在创建新的MVC控制器时: 单击“添加”按钮后,出现以下错误: 下面是我的简单上下文类: public class MainDbContext : DbContext { public MainDbContext(DbContextOptions<MainDbContext> options) : base(options) { } public DbSet<Todo> Todo { get; set; } } 我在这

在创建新的MVC控制器时:

单击“添加”按钮后,出现以下错误:

下面是我的简单上下文类:

  public class MainDbContext : DbContext
  {
    public MainDbContext(DbContextOptions<MainDbContext> options) : base(options)
    {
    }

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

  }
我在这个问题上做了一些搜索,大多数帖子都指向使用MVC的下拉列表或选择列表方法,但对于我来说,这是控制器创建失败,所以这似乎是实体框架的核心问题


有什么帮助吗?

这是工具错误。最有可能的情况是,您正在运行Visual Studio 2015,它没有完整的.NET核心支持。基本上,在EF的早期版本中,
DbContext
有一个无参数构造函数,而这个版本的scaffold生成器就依赖于此。在EF Core中,
DbContext
没有无参数构造函数,因此生成器无法使用该构造函数


如果您使用的是VS2015,请升级到2017。是时候。除此之外,你无论如何都不需要它,它只会把你引向一条不好的道路。脚手架所做的只是在
Controller
下创建一个新类,名为
{Name}Controller
,该类继承自
Controller
。然后,它在
视图中创建一个名为
{Name}
的文件夹,并添加一些用于执行CRUD的基本HTML。无论如何,您最终将替换大部分HTML。此外,脚手架要求您使用实际的实体类,这是您最不应该做的事情。您应该始终通过视图模型接受用户输入,然后在最终保存实体之前将发布的数据映射到实体类。将被破坏的脚手架视为开始学习如何创建好代码的绝佳机会。

感谢上面的@poke comment和此链接:,通过如下修改上下文类,C#将默认调用基类无参数构造函数

  public class MainDbContext : DbContext
  {
    public MainDbContext()
    // C# will call base class parameterless constructor by default
    {
    }
  }
services.AddDbContext<MainDbContext>(o => o.UseSqlServer(@"Data Source=SOURCE;Initial
Catalog=DBCatalog;User ID=ZX;Password=******;Connect
Timeout=30;Encrypt=False;TrustServerCertificate=False;
ApplicationIntent=ReadWrite;MultiSubnetFailover=False"));

给你。建议创建一个设计时类来实例化与数据库的连接。

只需向dbcontext中添加一个空构造函数,这就解决了问题。

解决方案 由于DbContext构造函数需要DbContextOptions,因此必须在启动配置方法中设置AddDbContext

public class MainDbContext : DbContext
      {
        public MainDbContext(DbContextOptions<MainDbContext> options) : base(options)
        {
        }

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

      }
公共类MainDbContext:DbContext { 公共MainDbContext(DbContextOptions选项):基本(选项) { } 公共DbSet Todo{get;set;} }
在projects startup.cs内设置AddDbContext

  public class MainDbContext : DbContext
  {
    public MainDbContext()
    // C# will call base class parameterless constructor by default
    {
    }
  }
services.AddDbContext<MainDbContext>(o => o.UseSqlServer(@"Data Source=SOURCE;Initial
Catalog=DBCatalog;User ID=ZX;Password=******;Connect
Timeout=30;Encrypt=False;TrustServerCertificate=False;
ApplicationIntent=ReadWrite;MultiSubnetFailover=False"));
services.AddDbContext(o=>o.UseSqlServer(@“数据源=源;初始值
Catalog=DBCatalog;用户ID=ZX;密码=******;连接
超时=30;加密=False;TrustServerCertificate=False;
ApplicationContent=ReadWrite;MultiSubnetFailover=False”);
配置服务方法: 设置数据库: 使用SQLServer, UseInMemeoryDatabase, UseSqlite, 等等。

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddDbContext<MainDbContext>(o => o.UseSqlServer(@"Data Source=SOURCE;Initial
        Catalog=DBCatalog;User ID=ZX;Password=******;Connect
        Timeout=30;Encrypt=False;TrustServerCertificate=False;
        ApplicationIntent=ReadWrite;MultiSubnetFailover=False"));                            
            }
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(o=>o.UseSqlServer(@“数据源=源;初始值
Catalog=DBCatalog;用户ID=ZX;密码=******;连接
超时=30;加密=False;TrustServerCertificate=False;
ApplicationContent=ReadWrite;MultiSubnetFailover=False”);
}

在搭建脚手架之前,确保您的项目构建和运行没有错误

在Visual Studio 2019中,我在尝试构建新控制器时收到此错误,因为appsettings.JSON文件中的JSON中缺少逗号

最终,我构建并尝试运行System.FormatException,并在运行时得到一个“无法解析JSON文件”的异常。 由于appsettings.json是我最近编辑的唯一json文件,我知道它必须是appsettings.json

脚手架、代码生成器和EF迁移调用运行时代码,这意味着即使您的代码进行编译,如果它抛出运行时错误,可能会导致此类操作出现问题

供参考- 从EF Core 2.1开始,允许使用参数化构造函数。 有关详细信息,请参阅这篇Microsoft文章。

解决方案是检查文件
Startup.cs
,如果在
void ConfigureServices
中有数据上下文,例如在SQLServer my
Startup.cs

public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        {

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

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }
公共类启动
{
//此方法由运行时调用。请使用此方法将服务添加到容器中。
//有关如何配置应用程序的更多信息,请访问https://go.microsoft.com/fwlink/?LinkID=398940
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(“yourConnectionString”));
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoints.MapGet(“/”,异步上下文=>
{
wait context.Response.WriteAsync(“Hello World!”);
});
});
}
}
如果您没有此服务,则错误为

没有为类型YourDataContextName定义无参数构造函数


您是否尝试过为
Todo
添加无参数构造函数?我尝试过教程中的几种组合,但没有人成功,这里控制器将“MainDbContext”作为构造函数参数,您能否提供一个无参数构造函数的代码段示例?我刚刚修复了,解决方案h