Ошибка «Невозможно создать объект типа« ApplicationDbContext ».» - PullRequest
0 голосов
/ 29 января 2020

Я работаю с Npg sql и Entity Framework. Я пытаюсь сделать новую миграцию, но у меня есть ошибка из названия вопроса. Я уже пробовал пример из документации 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);
    }
}

Ответы [ 2 ]

1 голос
/ 29 января 2020

Возможно, вы захотите ознакомиться с документацией для создания собственного класса DbContext и документацией для создания DbContext , чтобы узнать о некоторых дополнительных соображениях и рекомендациях.

Сначала Я заметил, что ваш контекстный класс не включает конструктор без параметров или конструктор, который принимает экземпляр 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);
    }
}
0 голосов
/ 29 января 2020

Я решил проблему! Итак, у меня просто есть проект Class library. В проекте у меня есть:

  • ApplicationDbContext.cs (как в вопросе)
  • Папка с миграциями.

И я просто поставил Program.cs файл со следующим содержанием:

public class Program
{
    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {
        public ApplicationDbContext CreateDbContext(string[] args)
        {
            var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile($"appsettings.{envName}.json")
                .Build();
            var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
            var connectionString = configuration.GetConnectionString("LalalalDb");
            builder.UseNpgsql(connectionString);
            return new ApplicationDbContext(configuration);
        }
    }
}

Наконец,

$ dotnet ef migrations add Lalalalalal - работает!

PS Не забудьте про файл appsettings.<Your ASPNETCORE_ENVIRONMENT>.json.

...