实体框架核心错误:没有为此对象定义无参数构造函数

时间:2017-10-26 20:23:15

标签: asp.net-mvc asp.net-core visual-studio-2017 entity-framework-core

在创建新的MVC控制器时:

enter image description here

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

enter image description here

这是我简单的Context类:

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

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

  }

和我的简单模型:

public partial class Todo
{
    public int Id { get; set; }
    public string TaskName { get; set; }
}

我已经对这个问题进行了一些搜索,大多数帖子指向使用MVC的下拉列表或SelectList方法,但对于我的情况,它是一个Controller创建失败,所以它似乎是一个实体框架核心问题

任何帮助?

7 个答案:

答案 0 :(得分:3)

这是一个工具错误。最有可能的是,您运行的是Visual Studio 2015,它没有完整的.NET Core支持。基本上,在以前的EF版本中,DbContext有一个无参数构造函数,这个版本的脚手架生成器依赖于它。在EF Core中,DbContext没有无参数构造函数,因此生成器会对此产生阻塞。

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

答案 1 :(得分:3)

感谢上面的@poke评论,感谢此链接:"Use Code First with connection by convention",通过修改上下文类如下默认情况下C#将调用基类无参数构造函数

  public class MainDbContext : DbContext
  {
    public MainDbContext()
    // C# will call base class parameterless constructor by default
    {
    }
  }

答案 2 :(得分:1)

这是the solution from Microsoft。它建议创建一个设计时类来实例化与数据库的连接。

答案 3 :(得分:0)

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

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

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

      }

在项目中startup.cs设置AddDbContext

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"));

ConfigureServices方法: 设置数据库: UseSqlServer, 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"));                            
            }

答案 4 :(得分:0)

在搭建脚手架之前,请确保您的项目能够正确构建并运行

在Visual Studio 2019中,由于我的appsettings.json文件中的JSON中缺少逗号,因此尝试安装新的控制器时收到此错误。

最终,我构建并尝试运行并获得了System.FormatException,“在运行时无法解析JSON文件”。 因为appsettings.json是我最近编辑的唯一JSON文件,所以我知道它必须是appsettings.json。

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

仅供参考- 从EF Core 2.1开始,允许使用参数化构造函数。 有关更多信息,请参见此Microsoft文章。 https://docs.microsoft.com/en-us/ef/core/modeling/constructors

答案 5 :(得分:0)

解决方案是检查文件Startup.cs是否在void ConfigureServices中的DataContext中,例如在SQLServer中我的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!");
                });
            });
        }
    }

如果您没有此服务,则错误为

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

答案 6 :(得分:-1)

只需在您的dbcontext中添加一个空的构造函数即可解决问题。