데이터 시드

데이터 시딩은 초기 데이터 세트로 데이터베이스를 채우는 프로세스입니다.

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

여러 인스턴스가 실행 중일 때 동시성 문제가 발생할 수 있으며 앱에 데이터베이스 스키마를 수정할 수 있는 권한이 있어야 하므로 시드 코드는 정상적인 앱 실행의 일부가 되어서는 안 됩니다.

배포의 제약 조건에 따라 초기화 코드를 다음과 같은 다양한 방법으로 실행할 수 있습니다.

  • 로컬로 초기화 앱 실행
  • 기본 앱을 사용하여 초기화 앱을 배포하고, 초기화 루틴을 호출하며, 초기화 앱을 사용하지 않도록 설정하거나 제거합니다.

일반적으로 게시 프로필을 사용하여 자동화할 수 있습니다.