UFO ET IT

Database.EnsureCreated 및 Database.Migrate를 어디에서 어떻게 호출합니까?

ufoet 2020. 12. 30. 08:32
반응형

Database.EnsureCreated 및 Database.Migrate를 어디에서 어떻게 호출합니까?


ASP.NET MVC 6 응용 프로그램이 Database.EnsureCreated있고 및 Database.Migrate메서드 를 호출해야 합니다.

하지만 어디로 전화해야합니까?


나는 이것이 중요한 질문이고 잘 대답되어야한다고 생각합니다!

Database.EnsureCreated 란 무엇입니까?

context.Database.EnsureCreated()컨텍스트에 대한 데이터베이스가 존재하는지 확인하는 새로운 EF 핵심 방법입니다. 존재하는 경우 조치가 수행되지 않습니다. 존재하지 않는 경우 데이터베이스 및 모든 스키마가 생성되고이 컨텍스트의 모델과 호환되는지 확인합니다.

참고 : 이 방법은 마이그레이션을 사용하여 데이터베이스를 생성하지 않습니다. 또한 생성 된 데이터베이스는 나중에 마이그레이션을 사용하여 업데이트 할 수 없습니다. 관계형 데이터베이스를 대상으로하고 마이그레이션을 사용하는 DbContext.Database.Migrate()경우이 방법을 사용하여 데이터베이스가 생성되고 모든 마이그레이션이 적용되는지 확인할 수 있습니다 .

EF 6으로 어떻게 했습니까?

context.Database.EnsureCreated() EF 6의 아래 나열된 접근 방식과 동일합니다.

  1. 패키지 관리자 콘솔 :

    Enable-Migrations -EnableAutomaticMigrations. 추가 마이그레이션 / 업데이트 데이터베이스.

  2. 코드에서 :

    Database.SetInitializer CreateDatabaseIfNotExists

또는

DbMigrationsConfiguration을 사용하고 AutomaticMigrationsEnabled = true로 설정합니다.

Database.Migrate 란 무엇입니까?

컨텍스트에 대해 보류중인 마이그레이션을 데이터베이스에 적용합니다. 데이터베이스가없는 경우 생성합니다.

EF 6으로 어떻게 했습니까?

context.Database.Migrate() EF 6의 아래 나열된 접근 방식과 동일합니다.

  1. 패키지 관리자 콘솔 :

    업데이트-데이터베이스 -TargetMigration

  2. 사용자 지정 DbMigrationsConfiguration 사용 :

    AutomaticMigrationsEnabled = false; 또는 DbMigrator와 함께.

결론 :

마이그레이션을 사용하는 경우 context.Database.Migrate(). 마이그레이션을 원하지 않고 빠른 데이터베이스 (일반적으로 테스트 용) 만 원하는 경우 context.Database.EnsureCreated () / EnsureDeleted ()를 사용하십시오.


James P와 Bassam Alugili가 제공 한 정보를 사용하여 결국 다음 코드 줄을 클래스 ( Startup.cs ) Configure메서드에 추가했습니다 .Startup

using (var scope = 
  app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
using (var context = scope.ServiceProvider.GetService<MyDbContext>())
    context.Database.Migrate();

앞서 언급 한 것처럼 Rowan Miller의 다음 내용을 읽어야 합니다 .

... EnsureCreated마이그레이션을 완전히 우회하고 스키마를 생성합니다. 마이그레이션과 혼합 할 수 없습니다. EnsureCreated매번 데이터베이스를 삭제하고 다시 생성해도 괜찮은 테스트 또는 신속한 프로토 타이핑을 위해 설계되었습니다. 마이그레이션을 사용 중이고 앱 시작시 자동으로 적용되도록하려면 context.Database.Migrate()대신 사용할 수 있습니다 .

여기 에 대한 답변에 따르면 다음 항목에 추가 Globals.EnsureDatabaseCreated();해야합니다 Startup.cs.

Startup.cs의 시작 기능 :

public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
            builder.AddApplicationInsightsSettings(developerMode: true);
    }
    Configuration = builder.Build();
    Globals.Configuration = Configuration;
    Globals.HostingEnvironment = env;
    Globals.EnsureDatabaseCreated();
}

그리고 다음 Globals.EnsureDatabaseCreated()과 같이 정의하십시오 .

public static void EnsureDatabaseCreated()
    {
        var optionsBuilder = new DbContextOptionsBuilder();
        if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:DataContext"]);
        else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:DataContext"]);
        else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:DataContext"]);
        var context = new ApplicationContext(optionsBuilder.Options);
        context.Database.EnsureCreated();

        optionsBuilder = new DbContextOptionsBuilder();
        if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:TransientContext"]);
        else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:TransientContext"]);
        else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:TransientContext"]);
        new TransientContext(optionsBuilder.Options).Database.EnsureCreated();
    }

사용하려면 여기 또는 여기를context.Database.Migrate() 참조 하십시오 .


Additionally you may see a performance hit if you call this in the constructor of your context... After moving EnsureCreated to the setup.cs utility, I noticed considerable improvements to my response times.

Note: I am using EFC and UWP.

ReferenceURL : https://stackoverflow.com/questions/38238043/how-and-where-to-call-database-ensurecreated-and-database-migrate

반응형