데이터 시드
데이터 시딩은 초기 데이터 세트로 데이터베이스를 채우는 프로세스입니다.
EF Core에서 이 작업을 수행할 수 있는 방법에는 여러 가지가 있습니다.
- 모델 시드 데이터
- 수동 마이그레이션 사용자 지정
- 사용자 지정 초기화 논리
모델 시드 데이터
EF6과 달리 EF Core에서 데이터 시드는 모델 구성의 일부로 엔터티 형식에 연결됩니다. 그런 다음, EF Core 마이그레이션은 데이터베이스를 모델의 새 버전으로 업그레이드할 때 삽입, 업데이트 또는 삭제 작업을 적용해야 하는 경우를 자동으로 컴퓨팅할 수 있습니다.
참고 항목
마이그레이션은 시드 데이터를 원하는 상태로 가져오기 위해 수행해야 하는 작업을 결정할 때만 모델 변경을 고려합니다. 따라서 마이그레이션 외부에서 수행되는 데이터를 변경하면 손실되거나 오류가 발생할 수 있습니다.
예를 들어 OnModelCreating
에서 Blog
에 대한 시드 데이터를 구성합니다.
modelBuilder.Entity<Blog>().HasData(new Blog { BlogId = 1, Url = "http://sample.com" });
관계가 있는 엔터티를 추가하려면 외래 키 값을 지정해야 합니다.
modelBuilder.Entity<Post>().HasData(
new Post { BlogId = 1, PostId = 1, Title = "First post", Content = "Test 1" });
엔터티 형식에 섀도 상태의 속성이 있는 경우 익명 클래스를 사용하여 값을 제공할 수 있습니다.
modelBuilder.Entity<Post>().HasData(
new { BlogId = 1, PostId = 2, Title = "Second post", Content = "Test 2" });
소유 엔터티 형식은 비슷한 방식으로 시드할 수 있습니다.
modelBuilder.Entity<Post>().OwnsOne(p => p.AuthorName).HasData(
new { PostId = 1, First = "Andriy", Last = "Svyryd" },
new { PostId = 2, First = "Diego", Last = "Vega" });
자세한 컨텍스트는 전체 샘플 프로젝트를 참조하세요.
데이터가 모델에 추가되면 마이그레이션을 통해 변경 내용을 적용해야 합니다.
팁
자동화된 배포의 일부로 마이그레이션을 적용해야 하는 경우 실행 전에 미리 볼 수 있는 SQL 스크립트를 만들 수 있습니다.
또는 context.Database.EnsureCreated()
를 사용하여 테스트 데이터베이스 또는 메모리 내 공급자나 비관계형 데이터베이스를 사용하는 경우와 같이 시드 데이터가 포함된 새 데이터베이스를 만들 수 있습니다. 데이터베이스가 이미 있는 경우 EnsureCreated()
는 데이터베이스의 스키마나 시드 데이터를 업데이트하지 않습니다. 관계형 데이터베이스의 경우 마이그레이션을 사용하려면 EnsureCreated()
를 호출해서는 안 됩니다.
모델 시드 데이터의 제한 사항
이 유형의 시드 데이터는 마이그레이션을 통해 관리되며 데이터베이스에 이미 있는 데이터를 업데이트하는 스크립트는 데이터베이스에 연결하지 않고 생성해야 합니다. 그러면 다음과 같은 몇 가지 제한 사항이 적용됩니다.
- 기본 키 값은 일반적으로 데이터베이스에서 생성되더라도 지정해야 합니다. 이는 마이그레이션 간의 데이터 변경 내용을 검색하는 데 사용됩니다.
- 기본 키가 어떤 방식으로든 변경되면 이전에 시드된 데이터가 제거됩니다.
따라서 이 기능은 마이그레이션 외부에서 변경될 것으로 예상되지 않고 데이터베이스의 다른 항목(예: 우편 번호)에 의존하지 않는 정적 데이터에 가장 유용합니다.
시나리오에 다음이 포함된 경우 마지막 섹션에 설명된 사용자 지정 초기화 논리를 사용하는 것이 좋습니다.
- 테스트를 위한 임시 데이터
- 데이터베이스 상태에 따라 달라지는 데이터
- 대용량 데이터(시드 데이터는 마이그레이션 스냅샷에서 캡처되고 대용량 데이터는 빠르게 거대한 파일 및 성능 저하로 이어질 수 있음)
- 대체 키를 ID로 사용하는 엔터티를 포함하여 데이터베이스에서 생성해야 하는 키 값이 필요한 데이터
- 일부 암호 해시와 같이 사용자 지정 변환이 필요한 데이터(값 변환에 의해 처리되지 않음)
- ASP.NET Core ID 역할 및 사용자 만들기와 같은 외부 API에 대한 호출이 필요한 데이터
수동 마이그레이션 사용자 지정
마이그레이션이 추가되면 HasData
에 지정된 데이터에 대한 변경 내용이 InsertData()
, UpdateData()
, DeleteData()
에 대한 호출로 변환됩니다. HasData
의 몇 가지 제한 사항을 해결하는 한 가지 방법은 이러한 호출 또는 사용자 지정 작업을 마이그레이션에 수동으로 추가하는 것입니다.
migrationBuilder.InsertData(
table: "Blogs",
columns: new[] { "Url" },
values: new object[] { "http://generated.com" });
사용자 지정 초기화 논리
데이터 시드를 수행하는 간단하고 강력한 방법은 기본 애플리케이션 논리가 실행을 시작하기 전에 DbContext.SaveChanges()
를 사용하는 것입니다.
using (var context = new DataSeedingContext())
{
context.Database.EnsureCreated();
var testBlog = context.Blogs.FirstOrDefault(b => b.Url == "http://test.com");
if (testBlog == null)
{
context.Blogs.Add(new Blog { Url = "http://test.com" });
}
context.SaveChanges();
}
Warning
여러 인스턴스가 실행 중일 때 동시성 문제가 발생할 수 있으며 앱에 데이터베이스 스키마를 수정할 수 있는 권한이 있어야 하므로 시드 코드는 정상적인 앱 실행의 일부가 되어서는 안 됩니다.
배포의 제약 조건에 따라 초기화 코드를 다음과 같은 다양한 방법으로 실행할 수 있습니다.
- 로컬로 초기화 앱 실행
- 기본 앱을 사용하여 초기화 앱을 배포하고, 초기화 루틴을 호출하며, 초기화 앱을 사용하지 않도록 설정하거나 제거합니다.
일반적으로 게시 프로필을 사용하여 자동화할 수 있습니다.
.NET