다음을 통해 공유


디자인 타임 DbContext 만들기

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

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

애플리케이션 서비스에서

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

도구는 먼저 호출, 호출Build(), 속성에 액세스하여 Program.CreateHostBuilder()서비스 공급자를 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 자체 및 해당 생성자의 모든 종속성은 애플리케이션의 서비스 공급자에서 서비스로 등록되어야 합니다. 이 작업은 인스턴스 DbContextOptions<TContext> 를 인수로 사용하는 생성자를 DbContext 만들고 메서드를 사용하여 AddDbContext<TContext>쉽게 달성할 수 있습니다.

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

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

디자인 타임 팩터리에서

인터페이스를 구현하여 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를 전혀 사용하지 않는 경우 또는 어떤 이유로든 ASP.NET Core 애플리케이션의 Main 클래스에 메서드를 사용하지 CreateHostBuilder 않으려는 경우에 특히 유용할 수 있습니다.

Args

명령줄 인수와 Program.CreateHostBuilder 명령줄 인수를 모두 IDesignTimeDbContextFactory<TContext>.CreateDbContext 허용합니다.

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

dotnet ef database update -- --environment Production

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