디자인 타임 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
형식을 찾습니다. 그런 다음 매개 변수가 없는 생성자를 사용하여 인스턴스를 만들려고 합니다. DbContext
가 OnConfiguring
메서드를 사용하여 구성된 경우 기본 생성자가 될 수 있습니다.
디자인 타임 팩터리에서
또한 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>.CreateDbContext 및 Program.CreateHostBuilder
는 모두 명령줄 인수를 수락합니다.
도구에서 다음 인수를 지정할 수 있습니다.
dotnet ef database update -- --environment Production
--
토큰은 뒤에 나타나는 모든 항목을 인수로 처리하고 이를 옵션으로 구문 분석하지 않도록 dotnet ef
에 지시합니다. dotnet ef
에서 사용하지 않는 추가 인수는 앱으로 전달됩니다.
.NET