没有为类型 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 名称更改,诸如此类。也许错误消息实际上并不是它看起来的那样,你在其他地方犯了一个小错误,只是生成了一条令人困惑的错误消息。
我在堆栈和其他站点中搜索了很多关于此错误的帖子,但这不是我的答案 这是我的 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 名称更改,诸如此类。也许错误消息实际上并不是它看起来的那样,你在其他地方犯了一个小错误,只是生成了一条令人困惑的错误消息。