디자인 타임 DbContext 만들기

일부 EF Core Tools 명령(예: 마이그레이션 명령)에서는 애플리케이션의 엔터티 형식 및 데이터베이스 스키마에 매핑하는 방법에 대한 세부 정보를 수집하기 위해 디자인 타임에 파생 DbContext 인스턴스를 만들어야 합니다. 대부분의 경우 생성되는 DbContext런타임에 구성되는 방법과 유사한 방식으로 구성하는 것이 좋습니다.

도구에서 DbContext를 만드는 다양한 방법이 있습니다.

애플리케이션 서비스에서

시작 프로젝트에서 ASP.NET Core 웹 호스트 또는 .NET Core 일반 호스트를 사용하는 경우 도구는 애플리케이션의 서비스 공급자로부터 DbContext 개체를 가져오려고 합니다.

도구는 먼저 Program.CreateHostBuilder()를 호출하고 Build()를 호출한 다음 Services 속성에 액세스하여 서비스 공급자를 가져오려고 합니다.

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 void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}

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

참고 항목

새 ASP.NET Core 애플리케이션을 만들 때 이 후크는 기본적으로 포함됩니다.

DbContext 자체 및 해당 생성자의 모든 종속성은 애플리케이션의 서비스 공급자에서 서비스로 등록되어야 합니다. 이 작업은 DbContextOptions<TContext>의 인스턴스를 인수로 사용하고AddDbContext<TContext> 메서드를 사용하여 DbContext에 생성자를 두는 것으로 쉽게 수행할 수 있습니다.

매개 변수 없이 생성자 사용

애플리케이션 서비스 공급자에서 DbContext를 가져올 수 없는 경우 도구는 프로젝트 내에서 파생된 DbContext 형식을 찾습니다. 그런 다음 매개 변수가 없는 생성자를 사용하여 인스턴스를 만들려고 합니다. DbContextOnConfiguring 메서드를 사용하여 구성된 경우 기본 생성자가 될 수 있습니다.

디자인 타임 팩터리에서

또한 Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> 인터페이스를 구현하여 DbContext를 만드는 방법을 도구에 알릴 수 있습니다. 이 인터페이스를 구현하는 클래스가 파생된 DbContext와 같은 프로젝트나 애플리케이션의 시작 프로젝트에서 발견되면 도구는 DbContext를 만드는 다른 방법을 무시하고 디자인 타임 팩터리를 대신 사용합니다.

public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
{
    public BloggingContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
        optionsBuilder.UseSqlite("Data Source=blog.db");

        return new BloggingContext(optionsBuilder.Options);
    }
}

디자인 타임 팩터리는 런타임과 디자인 타임에 대해 DbContext를 다르게 구성해야 하거나, 추가 매개 변수를 사용하는 DbContext 생성자가 DI에 등록되지 않거나, DI를 전혀 사용하지 않거나, 어떤 이유로든 ASP.NET Core 애플리케이션의 Main 클래스에 CreateHostBuilder 메서드를 사용하지 않으려는 경우에 특히 유용할 수 있습니다.

Args

IDesignTimeDbContextFactory<TContext>.CreateDbContextProgram.CreateHostBuilder는 모두 명령줄 인수를 수락합니다.

도구에서 다음 인수를 지정할 수 있습니다.

dotnet ef database update -- --environment Production

-- 토큰은 뒤에 나타나는 모든 항목을 인수로 처리하고 이를 옵션으로 구문 분석하지 않도록 dotnet ef에 지시합니다. dotnet ef에서 사용하지 않는 추가 인수는 앱으로 전달됩니다.