Entity Framework Core에서 데이터베이스 자동 생성
.NET Core로 포팅되는 내 애플리케이션은 SQLite와 함께 새로운 EF Core를 사용합니다. 앱이 처음 실행될 때 자동으로 데이터베이스 및 테이블 구조를 만들고 싶습니다. EF 핵심 문서에 따르면 수동 명령을 사용하여 수행됩니다.
dotnet ef migrations add MyFirstMigration
dotnet ef database update
그러나 최종 사용자가 이러한 명령을 입력하는 것을 원하지 않으며 앱이 처음 사용할 데이터베이스를 만들고 설정하는 것을 선호합니다. EF 6의 경우 다음과 같은 기능이 있습니다.
Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
그러나 EF Core에서는 존재하지 않는 것 같습니다. EF 코어와 동등한 것에 대한 예제 나 문서를 찾을 수 없으며 EF 코어 문서의 누락 된 기능 목록에 언급되지 않았습니다. 모델 클래스를 이미 설정 했으므로 모델을 기반으로 데이터베이스를 초기화하는 코드를 작성할 수 있지만 프레임 워크가이를 자동으로 수행하면 힙이 더 쉬울 것입니다. 모델을 자동으로 빌드하거나 마이그레이션하지 않고 새 데이터베이스에 테이블 구조를 만듭니다.
여기에 뭔가 누락되었거나 EF 코어에서 자동 생성 테이블 함수가 누락 되었습니까?
마이그레이션을 만든 경우 다음과 같이 Startup.cs 에서 실행할 수 있습니다.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
context.Database.Migrate();
}
...
그러면 추가 된 마이그레이션을 사용하여 데이터베이스와 테이블이 생성됩니다.
Entity Framework 마이그레이션을 사용하지 않고 대신 처음 실행할 때 컨텍스트 클래스에있는 그대로 생성 된 DbContext 모델이 필요한 경우 다음을 사용할 수 있습니다.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
context.Database.EnsureCreated();
}
...
대신.
데이터베이스가 생성되었는지 확인하기 전에 데이터베이스를 삭제해야하는 경우 다음을 호출하십시오.
context.Database.EnsureDeleted();
ensureCreated () 를 호출하기 직전
수정 출처 : http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html?highlight=entity
내 대답은 Ricardo의 대답과 매우 유사하지만 그의 using기능 에 너무 많은 일이 일어나서 낮은 수준에서 정확히 어떻게 작동하는지조차 확실하지 않기 때문에 내 접근 방식이 조금 더 간단하다고 느낍니다 .
따라서 내부에서 무슨 일이 일어나고 있는지 정확히 알고있는 데이터베이스를 생성하는 간단하고 깨끗한 솔루션을 원하는 사람들을 위해 다음과 같이하십시오.
public Startup(IHostingEnvironment env)
{
using (var client = new TargetsContext())
{
client.Database.EnsureCreated();
}
}
이것은 DbContext당신이 만든 (이 경우에는 내 이름이라고 함 TargetsContext)의 인스턴스를 사용하여 Startup.cs 가 애플리케이션에서 실행될 DbContext때 클래스에 정의 된 테이블이 생성 되도록 할 수 있음을 의미합니다.
Startup.cs의 Configure 매개 변수 목록을 통해 컨텍스트를 얻는 경우 대신 다음을 수행 할 수 있습니다.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, LoggerFactory loggerFactory,
ApplicationDbContext context)
{
context.Database.Migrate();
...
마이그레이션을 생성하지 않은 경우 두 가지 옵션이 있습니다.
1. 응용 프로그램 Main에서 데이터베이스 및 테이블을 만듭니다.
var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();
2. 데이터베이스가 이미있는 경우 테이블을 만듭니다.
var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();
RelationalDatabaseCreator databaseCreator =
(RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>();
databaseCreator.CreateTables();
Bubi의 답변 덕분에
For EF Core 2.0+ I had to take a different approach because they changed the API. As of March 2019 Microsoft recommends you put your database migration code in your application entry class but outside of the WebHost build code.
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var serviceScope = host.Services.CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<PersonContext>();
context.Database.Migrate();
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
참고URL : https://stackoverflow.com/questions/42355481/auto-create-database-in-entity-framework-core
'Nice programing' 카테고리의 다른 글
| 흐릿한 투명한 배경 효과 만들기 (0) | 2020.11.07 |
|---|---|
| 마우스를 올려도 "youtube"상단의 막대를 숨기는 방법은 무엇입니까? (0) | 2020.11.07 |
| 이전 인터프리터 버전으로 인해 실패한 향후 기능 (__future__) 가져 오기를 정상적으로 처리하는 방법은 무엇입니까? (0) | 2020.11.07 |
| List (of object)를 List (of string)로 변환 (0) | 2020.11.07 |
| MySQL. (0) | 2020.11.07 |