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

no parameterless constructor defined for type dbcontext

我在堆栈和其他站点中搜索了很多关于此错误的帖子,但这不是我的答案 这是我的 DbCintext

[Table("AspNetUsers")]
public class ApplicationUser : IdentityUser { }

public class EMSContext : IdentityDbContext<ApplicationUser> {
   

    public EMSContext (DbContextOptions<EMSContext> options) : base (options) { }

    public DbSet<Ambulance> Ambulances { get; set; }
 }

这是 mu StartUp.cs

 services.AddControllers();
        
        services.AddDbContext<EMSContext>(options =>
          options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

但是当我想生成 api 控制器时我得到了这个错误

no parameterless constructor defined for type dbcontext

错误恰好位于这一行:

public EMSContext (DbContextOptions<EMSContext> options) : base (options) { }

DbContext 没有无参数构造函数...当然,因为您的构造函数采用一个参数 DbContextOptions 选项,

所以你有两个选项来修复它,修复对构造函数的调用或使构造函数采用 0 个参数

错误很明显,您没有无参数构造函数。

但是也就是说,工具 不需要它 因为您正在调用 AddDbContext 并传入您的连接字符串。工具支架 controllers/etc。通过实际 运行 安装您的程序,然后向主机的服务提供商请求 DbContext。它通过寻找具有 非常具体的名称 .

的方法来实现这一点

我的猜测是您的主要 Program.cs 没有遵循规定的模式,因此无法构建您的 Host 也无法找到它的 ServiceProvider

你的选择如下(我个人的选择是#2):

  • 如消息所述添加无参数构造函数
  • 确保您的主入口点使用主机生成器方法的正确约定
  • 创建设计时上下文工厂

无参数构造函数

这是显而易见的答案,尽管并非总是可行。此外,它应该不是必需的,因为脚手架有其他方式可以从您的 DbContext 读取数据。为此目的添加构造函数不是我会做也不推荐的事情。

正确的命名/方法签名

脚手架在尝试 运行 您的程序时会寻找非常具体的方法签名。基本上,它正在寻找这样的东西:

public class Program
{
    public static void Main(string[] args)
        => CreateHostBuilder(args).Build().Run();

    // EF Core uses this method at design time to access the DbContext
    public static IHostBuilder CreateHostBuilder(string[] args)
        => Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(
                webBuilder => webBuilder.UseStartup<Startup>());
}

现在不需要完全这样了。重要的部分是CreateHostBuilder方法的名称和签名。*

如果在尝试构建服务时出现任何错误,例如因为存在无法解析的依赖项或缺少配置,则此方法将失败。我很确定您会遇到相同的错误或与 DI 相关的错误。**

设计时工厂

假设 still 不起作用或者您想要更好的控制,您可以为您的上下文创建一个 Design-Time Factory .该工具将扫描您的项目以查找实现 IDesignTimeDbContextFactory<EMSContext> 的类型,然后在脚手架期间使用它:

public class EMSContextFactory : IDesignTimeDbContextFactory<EMSContext>
{
    public EMSContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<EMSContext>();
        optionsBuilder.UseSqlServer("Your Connection String");

        return new EMSContext(optionsBuilder.Options);
    }
}

有关详细信息,请参阅 this link

* 注意:您没有指定您 运行ning 的 aspnet 核心版本。如果您没有使用 通用主机 (Host.CreateDefaultBuilder) 而是使用 WebHost,那么预期的方法签名看起来会有点不同。也就是说,它将与创建具有相同设置的新项目相匹配。

如果您曾经为您的控制器编写过集成测试,WebApplicationFactory 会寻找类似的 methods/signatures。这些相同的签名应该满足控制器脚手架。除了上面的 link 之外,我似乎找不到其他文档。

** 当脚手架 运行s 时,它作为 'Production' 环境执行。如果服务 resolution/configuration 由于处于“错误”环境中而失败,则可能会发生 DI 错误。这是上下文工厂解决方案存在的原因之一。

这是我遇到的错误,听起来与你的非常相似。

我在尝试创建视图(红色圈出的视图)时遇到了这个问题。我的问题是 Startup.cs 文件。我最近完成了从 LeaveHistory...LeaveRequest... 的 re-name,在编辑我的 Startup.cs 时文件我做了一个不正确的更改。

第 39 行应为:

services.AddScoped<ILeaveRequestRepository, LeaveRequestRepository>();  // no "I"

我提到的错误是 dbContext class 没有无参数构造函数 - 所以它完全是骗人的,或者至少没有那么有用。

所以对于其他看到此错误的人,请不要当真!我对这个项目相当深入,none 我的其他控制器有无参数构造函数,至少没有写出来。

想想您所做的其他文书更改 - class 名称更改,诸如此类。也许错误消息实际上并不是它看起来的那样,你在其他地方犯了一个小错误,只是生成了一条令人困惑的错误消息。