다음을 통해 공유


디자인 타임의 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)
    {
    }
}

Note

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

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

매개 변수가 없는 생성자 사용

애플리케이션 서비스 공급자에서 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를 구성해야 할 필요가 있을 경우, 생성자가 DI에 등록되지 않은 추가 매개 변수를 필요로 할 경우, DI를 전혀 사용하지 않는 경우, 또는 어떤 이유로든 ASP.NET Core 애플리케이션의 DbContext 클래스에서 CreateHostBuilder 메서드를 사용하지 않으려는 경우에 특히 유용할 수 있습니다.

Args

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

도구에서 이러한 인수를 지정할 수 있습니다.

dotnet ef database update -- --environment Production

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