我在堆栈和其他网站中搜索了许多关于此错误的帖子,但这不是我的答案 这是我的 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 Controller 时出现此错误
no parameterless constructor defined for type dbcontext
最佳答案
错误很明显,您没有无参数构造函数。
但是也就是说,该工具不应该需要它,因为您正在调用 AddDbContext
并传入您的连接字符串。工装脚手架 Controller /等。通过实际运行您的程序然后请求 DbContext
来自主机的服务提供商。它通过查找具有非常具体的名称的方法来实现这一点。
我的猜测是你的主要 Program.cs
不遵循规定的模式,因此无法构建您的 Host
也找不到它的 ServiceProvider
.
您的选择如下(我个人的选择是#2):
- 添加一个无参数构造函数,如消息所示
- 确保您的主入口点使用主机构建器方法的正确约定
- 创 build 计时上下文工厂
无参数构造函数
这是显而易见的答案,尽管并不总是可能。此外,这应该不是必要的,因为脚手架有其他方式可以从您的 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 相关的错误。**
设计时间工厂
假设仍然不起作用或者您想要更好的控制,您可以为您的上下文创建一个设计时工厂。该工具将扫描您的项目以查找实现 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
,那么预期的方法签名会看起来有点不同。也就是说,它将与使用相同设置创建新项目相匹配。
如果您曾经为 Controller 编写过集成测试,WebApplicationFactory
寻找类似的方法/签名。这些相同的签名应该满足 Controller 脚手架。除了上面的链接之外,我似乎找不到任何相关文档。
** 当脚手架运行时,它作为“生产”环境执行。如果服务解析/配置由于处于“错误”环境而失败,则可能会发生 DI 错误。这是上下文工厂解决方案存在的原因之一。
关于c# - 没有为 dbcontext 类型定义无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62854599/