programing

데이터베이스를 호출하는 방법 및 위치.작성 및 데이터베이스를 확인합니다.이주?

minimums 2023. 5. 18. 20:51
반응형

데이터베이스를 호출하는 방법 및 위치.작성 및 데이터베이스를 확인합니다.이주?

ASP MVC 6 .NET MVC 6에 .Database.EnsureCreated그리고.Database.Migrate방법들.

하지만 어디로 전화해야 할까요?

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

데이터베이스란?생성 확인?

context.Database.EnsureCreated()컨텍스트에 대한 데이터베이스가 존재하도록 보장하는 새로운 EF 코어 메서드입니다.이 옵션이 있으면 작업이 수행되지 않습니다.데이터베이스가 없는 경우 데이터베이스와 모든 스키마가 생성되고 이 컨텍스트의 모델과 호환됩니다.

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

EF6로 어떻게 했습니까?

context.Database.EnsureCreated() 6EF 6의 합니다.

  1. 패키지 관리자 콘솔:

    사용 - 마이그레이션 - 사용자동 마이그레이션.추가-마이그레이션/업데이트-데이터베이스.

  2. 원본 코드:

    데이터베이스.Initializer 설정 데이터베이스 만들기없는 경우

또는

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

데이터베이스란?이주?

컨텍스트에 대한 보류 중인 마이그레이션을 데이터베이스에 적용합니다.데이터베이스가 아직 없는 경우 데이터베이스를 만듭니다.

EF6로 어떻게 했습니까?

context.Database.Migrate() 6EF 6의 합니다.

  1. 패키지 관리자 콘솔:

    업데이트 - 데이터베이스 - 대상 마이그레이션

  2. 사용자 지정 DbMigrations 구성을 사용하는 경우:

    AutomaticMigrationsEnabled = false 또는 DbMigrator를 사용합니다.

결론:

에는 마그레션경다있습음니다이가 있습니다.context.Database.Migrate()마이그레이션을 원하지 않고 빠른 데이터베이스(일반적으로 테스트용)만 원하는 경우 컨텍스트를 사용합니다.파일 이름.생성됨()/삭제됨()을 확인합니다.

James P와 Bassam Alugili가 제공한 정보로, 제가 결국 한 것은 이 코드 라인들을 추가하는 것이었습니다.Configure의법에 있는 Startup클래스(Startup.cs ):

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

보통,DbContext의 종속성 주입 에 추가됩니다.Startup.ConfigureServices() 예:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add DbContext to the injection container
        services.AddDbContext<MyDbContext>(options =>
                options.UseSqlServer(
                    this.Configuration.GetConnectionString("DefaultConnection")));
    }
}

하만지그, 그.IServiceCollection서비스 제공자 역할을 하지 않으며, 이후DbContext현재 범위 이전에는 주입 용기에 등록되지 않았습니다(Startup.ConfigureServices), 수 .), 이 문서에서는 종속성 주입을 통해 컨텍스트에 액세스할 수 없습니다.

Henk Mollema는 여기에서 시작하는 동안 수동으로 서비스를 해결하는 방법에 대해 논의하지만, 다음과 같이 언급합니다.

서비스를 수동으로 해결(서비스 로케이터라고도 함)하는 것은 일반적으로 안티패턴으로 간주됩니다...[그리고] 당신은 가능한 한 그것을 피해야 합니다.

Henk는 또한 언급합니다.Startup이며 생자의종주매제구서않포다습에 .Startup.ConfigureServices()따라서 앱의 나머지 부분에서 사용되는 주입 컨테이너를 통해 DbContext를 가장 쉽고 적합하게 사용할 수 있습니다.

런타임의 의 할 수 .Startup,스.IConfiguration,IWebHostEnvironment(IHostingEnvironment 버전 3.0 버전)ILoggerFactory그리고.IServiceProvider후자는 호스팅 계층에 의해 구축된 인스턴스이며 애플리케이션을 시작하는 데 필요한 필수 서비스만 포함합니다.

전하기위해화해에 전화하기 .Database.EnsureCreated()또는Database.Migrate()수 .Startup.Configure()서 구성된 DI 제를 DI 할사수습용서비스를 사용할 수 .

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add DbContext to the injection container
        services.AddDbContext<MyDbContext>(options =>
                options.UseSqlServer(
                    this.Configuration.GetConnectionString("DefaultConnection")));
    }

    public static void Configure(IApplicationBuilder app, IWebHostEnvironment env, MyDbContext context)
    {
        if (env.IsDevelopment())
        {
            context.Database.EnsureCreated();
            //context.Database.Migrate();
        }
    }
}

EF Core 문서에서 언급된 바삼 알루길리의 답변은 다음과 같습니다.Database.EnsureCreated()그리고.Database.Migrate()기존 마이그레이션이 데이터베이스에 적용되고 필요한 경우 생성되므로 함께 사용할 수 없습니다.존재하는지 존재하지 합니다.DbContext컨텍스트에서 Fluent API를 통해 수행된 모든 시드를 포함합니다.

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()여기나 여기를 보세요.

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddDbContext<YourDbContext>(option => option.UseSqlServer(@"Data source=(localdb)\ProjectModels;Initial Catalog=YourDb;Integrated Security=True"));

var app = builder.Build();

// Configure the HTTP request pipeline.
YourDbContext dbcontext = app.Services.GetRequiredService<YourDbContext>();
dbcontext.Database.EnsureCreated();

또한 컨텍스트의 생성자에서 이를 호출하면 성능이 저하될 수 있습니다. 후 동후이.EnsureCreatedsetup.cs 유틸리티를 사용하여 응답 시간이 상당히 개선되었습니다.

참고: 저는 EFC와 UWP를 사용하고 있습니다.

VS 2022와 함께 작업하는 경우 /.Net Version 6에서는 데이터베이스를 만드는 방법을 찾고 있습니다.그리고나서

다음 단계를 수행합니다.

Microsoft 추가.엔티티 프레임워크입니다.Package Manager 콘솔의 Package Manager를 통한 도구 참조

1단계 실행

마이그레이션 추가 초기 마이그레이션

초기 마이그레이션은 원하는 항목을 입력할 수 있는 사용자 지정 이름입니다.그냥 내버려 둬

2단계

업데이트 - 데이터베이스

데이터베이스가 생성됩니다.

저는 ASP.NET Core 6 Web API를 개발하고 있습니다.

Program.cs앱을 구축한 후 아래 코드를 작성했습니다.

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    using var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
    context.Database.EnsureCreated();
}

context.Database.EnsureCreated()컨텍스트에 대한 데이터베이스가 있는지 확인합니다.

  • 데이터베이스가 존재하고 테이블이 있는 경우, 수행되지 않습니다.데이터베이스 스키마가 Entity Framework 모델과 호환되는지 확인하기 위해 수행되는 작업은 없습니다.
  • 데이터베이스가 존재하지만 테이블이 없는 경우 Entity Framework 모델을 사용하여 데이터베이스 스키마를 작성합니다.
  • 데이터베이스가 없는 경우 데이터베이스가 작성되고 Entity Framework 모델이 데이터베이스 스키마를 작성하는 데 사용됩니다.

내가 도와주고 싶었다.

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

반응형