在创建新的MVC控制器时:
单击“添加”按钮后,出现以下错误:
这是我简单的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创建失败,所以它似乎是一个实体框架核心问题
任何帮助?
答案 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中添加一个空的构造函数即可解决问题。