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

时间:2020-07-11 21:06:31

标签: c# asp.net-core-mvc 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控制器时,出现此错误

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

2 个答案:

答案 0 :(得分:2)

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

但是,话虽如此,该工具不需要它,因为您正在调用AddDbContext并传递连接字符串。工具脚手架控制器/等。通过实际运行程序,然后向主机的服务提供商请求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

*注意:您尚未指定运行的aspnet core版本。如果您不是使用通用主机Host.CreateDefaultBuilder),而是使用WebHost,则预期的方法签名将看起来有些不同。也就是说,它将与使用相同设置创建一个新项目相匹配。

如果您曾经为控制器编写过集成测试,则WebApplicationFactory将寻找相似的方法/签名。这些相同的签名应满足控制器的要求。除了上面的链接,我似乎找不到其他文档。

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

答案 1 :(得分:0)

错误正好位于此行中:

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

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

因此您有两个选项可以修复它,可以修复对构造函数的调用,也可以使构造函数接受0个参数