我在堆栈和其他网站中搜索了很多有关此错误的信息,但这不是我的答案 这是我的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类型定义无参数构造函数
答案 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个参数