【问题标题】:No parameterless constructor was found on 'ApplicationDbContext'. in Asp Core在“ApplicationDbContext”上找不到无参数构造函数。在 Asp 核心
【发布时间】:2018-01-13 18:44:51
【问题描述】:

我为 ASP Core 中的初始数据库创建了这个。我用这个:

dotnet ef migrations add InitialCreate

但它告诉我这个错误:

在“ApplicationDbContext”上找不到无参数构造函数。将无参数构造函数添加到“ApplicationDbContext”或在与“ApplicationDbContext”相同的程序集中添加“IDbContextFactory”的实现。

但我创建了一个 Constructor 。有什么问题 ?我该如何解决这个问题?

ApplicationDBContext:

 public class ApplicationDbContext : ApplicationDbContextBase
{
    public ApplicationDbContext(
        IOptionsSnapshot<SiteSettings> siteSettings
        , IHttpContextAccessor httpContextAccessor
        , IHostingEnvironment hostingEnvironment
        , ILogger<ApplicationDbContextBase> logger)
        : base(siteSettings, httpContextAccessor, hostingEnvironment, logger)
    {
    }


    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.AddCustomIdentityMappings(SiteSettings.Value);
        builder.AddAuditableShadowProperties();
    }

ApplicationDbContextBase:

  public abstract class ApplicationDbContextBase :
   IdentityDbContext<User, Role, int, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>,
   IUnitOfWork
{
    protected readonly IHostingEnvironment HostingEnvironment;
    protected readonly IHttpContextAccessor HttpContextAccessor;
    protected readonly ILogger<ApplicationDbContextBase> Logger;
    protected readonly IOptionsSnapshot<SiteSettings> SiteSettings;
    private string v;

    public ApplicationDbContextBase(string v)
    {
        this.v = v;
    }

    protected ApplicationDbContextBase(
        IOptionsSnapshot<SiteSettings> siteSettings,
        IHttpContextAccessor httpContextAccessor,
        IHostingEnvironment hostingEnvironment,
        ILogger<ApplicationDbContextBase> logger)
    {
        SiteSettings = siteSettings;
        SiteSettings.CheckArgumentIsNull(nameof(SiteSettings));

        HttpContextAccessor = httpContextAccessor;
        HttpContextAccessor.CheckArgumentIsNull(nameof(HttpContextAccessor));

        HostingEnvironment = hostingEnvironment;
        HostingEnvironment.CheckArgumentIsNull(nameof(HostingEnvironment));

        Logger = logger;
        Logger.CheckArgumentIsNull(nameof(Logger));
    }

更新

我在 Github 上传我的项目。 GitHub

【问题讨论】:

  • 你是如何使用这个 DbContext 类的?您是否收到运行时错误或编译时错误?你在使用任何 DI 容器吗?
  • 如果您为 ApplicationDbContext 类添加自己的构造函数,则删除默认的无参数构造函数。您需要手动将其读取到您的代码中:只需添加 public ApplicationDbContext()
  • @Steve 我写了这个构造函数:public ApplicationDbContext() : base("ApplicationDbContext") { } 但它告诉我这个错误:Object reference not set to an instance of an object.
  • @ChetanRanpariya 我更新问题
  • @Vanna 我更新问题

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc asp.net-core-1.1


【解决方案1】:
public class ApplicationDbContext : ApplicationDbContextBase
{
    public ApplicationDbContext(
        IOptionsSnapshot<SiteSettings> siteSettings
        , IHttpContextAccessor httpContextAccessor
        , IHostingEnvironment hostingEnvironment
        , ILogger<ApplicationDbContextBase> logger)
        : base(siteSettings, httpContextAccessor, hostingEnvironment, logger)
    {
}

在这个base关键字中用于发送数据的ApplicationDbContextBase不是ApplicationDbContext。

ApplicationDbContext 和 ApplicationDbContext 类需要传递多个参数。所以,类说 No parameterless constructor was found on 'ApplicationDbContext'。如果需要传递参数。否则创建没有参数的构造函数。 喜欢

public class ApplicationDbContext : ApplicationDbContextBase
{
public ApplicationDbContext() 
 {
 }
}

并传递基本参数。

如果您在 DI 中使用,请注册所有必需的对象。 我认为它有助于识别和解决问题。

【讨论】:

  • 它告诉我这个错误:Object reference not set to an instance of an object.
  • 我更新问题
【解决方案2】:

问题是因为您的 ApplicationDbContextBase 类中没有任何默认构造函数,并且 ApplicationDbContextBase 无法通过依赖注入解决(有关更多信息,请参阅此url)。改变

   public ApplicationDbContextBase(string v)
    {
        this.v = v;
    }

  public ApplicationDbContextBase()
    {

    }

或添加默认构造函数。

【讨论】:

  • 我用这个:public ApplicationDbContextBase() { } 但它不起作用。仍然显示错误
  • 请以这种方式测试您的代码:var x= new ApplicationDbContext();看看是否可以在没有任何参数的情况下新建 ApplicationDbContext。如果你能做到,那么应该没有任何问题(它只是为了测试,不要在你的代码中使用它)
  • 我更新问题
【解决方案3】:
  • 当 EF Core 想要实例化上下文时,它会使用内置的依赖注入系统来完成。现在它会发现你这里有不止一个构造函数。然后它会抛出一个异常告诉你:I don't know which one of these constructors should be used to instantiate the context。要解决它,请删除所有其他构造函数(此处的构造函数不应超过 1 个)。只保留带有IOptionsSnapshot&lt;SiteSettings&gt; 参数的那个,然后删除其他的。
  • EF Core 能够使用内置的依赖注入系统在此处处理所有注入的构造函数参数。但是您应该只有 1 构造函数才能使其工作。它不使用原始的new ApplicationDbContext()。它将在幕后使用serviceScope.ServiceProvider.GetRequiredService 来实例化上下文及其所有注入参数。
  • 如果此处需要其他配置参数,只需使用注入的IOptionsSnapshot&lt;SiteSettings&gt; 并修改SiteSettings,但不要为此添加其他构造函数。
  • 如果您已将上下文移动到另一个程序集,EF Core 应该能够找到注入的依赖项,并且您也应该提供 --startup-project ../your_project_name/

【讨论】:

  • 我下载了 DNT 项目。我复制你的代码。但仍然告诉我那个错误。我保留一个构造函数。
  • 我更新问题
  • 这里没有问题。我可以运行你的_01-add_migrations.cmd 没有任何问题或错误。您应该更新您的 .NET Core SDK 和 RunTime。这是你的问题:microsoft.com/net/download/core#/runtime
猜你喜欢
  • 2020-09-15
  • 2021-07-21
  • 2017-11-06
  • 2022-09-23
  • 2018-04-15
  • 2010-10-06
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多