首页 > 解决方案 > 错误“无法创建 'ApplicationDbContext' 类型的对象。”

问题描述

我正在使用 Npgsql 和实体框架。我正在尝试进行新的迁移,但问题标题中出现错误。我已经尝试过MS 文档中的示例。

所以,我的代码是:

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>());
}

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseNpgsql(Configuration.GetConnectionString("LalalaDb")));
    }
}

问题出在哪里?我如何进行迁移?

更新

这是我的ApplicationDbContext.cs

public class ApplicationDbContext : IdentityDbContext
{
    private readonly string _connectionString;

    public DbSet<Customer> Customers { get; set; }
    // and more DbSets are here ... 

    public ApplicationDbContext(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("LalalaDb");
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql(_connectionString, b => b.MigrationsAssembly("EntityFrameworkProject"));
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

标签: c#asp.net-core.net-corenpgsql

解决方案


您可能需要查看用于构建您自己的 DbContext 类文档和 DbContext Creation的文档,以了解一些其他注意事项/最佳实践。

我注意到的第一件事是您的上下文类不包含无参数构造函数或接受DbContextOptions<T>实例的构造函数,这可能是无法创建迁移的原因。

public class ApplicationDbContext : IdentityDbContext
{
    private readonly string _connectionString;

    public DbSet<Customer> Customers { get; set; }
    // and more DbSets are here ... 

    public ApplicationDbContext() : base()
    { }

    public ApplicationDbContext(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("LalalaDb");
    }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    { }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql(_connectionString, b => b.MigrationsAssembly("EntityFrameworkProject"));
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

推荐阅读