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

标签 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 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/

相关文章:

c# - 不同 DbContext 和不同模式之间的 Entity Framework 关系

c# - 使用依赖注入(inject)时如何修复 'A second operation started on this context before a previous operation completed...'?

c# - 防止 DbContext 反复尝试保存错误数据

c# - 通过使用转换器来转换对象来绑定(bind)到任意 Dictionary<,>

c# - 拆分逗号分隔的字符串 5

c# - 从存储过程返回最后插入行的标识

c# - '无法从程序集加载类型 'Microsoft.AspNetCore.Mvc.MvcJsonOptions' 'Microsoft.AspNetCore.Mvc.Formatters.Json,版本=3.0.0.0

c# - 使用 Controller 类以外的类进行依赖注入(inject)

c# - ASP.NET MVC 6 AspNet.Session 错误 - 无法解析类型服务?

c# - 无法添加服务引用