2014-09-06 6 views
1

ASP.NET MVC5 프로젝트에서 EF 코드 첫 마이그레이션을 사용하고 있습니다. 약 5000 개의 레코드로 데이터베이스를 시드하려고합니다. asp.net 웹 사이트 및 블로그의 예제에는 모두 구성 방법 내에서 시드 함수가 있습니다.EF 마이그레이션 큰 데이터 세트로 시드하기

internal sealed class Configuration : DbMigrationsConfiguration<foo.ApplicationDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     MigrationsDirectory = @"Migrations\ApplicationDbContext"; 
    } 

    protected override void Seed(foo.ApplicationDbContext context) 
    { 

     SeedProducts(context); 
     SeedFoods(context); 


     // This method will be called after migrating to the latest version. 

     // You can use the DbSet<T>.AddOrUpdate() helper extension method 
     // to avoid creating duplicate seed data. E.g. 
     // 
     // context.People.AddOrUpdate(
     //  p => p.FullName, 
     //  new Person { FullName = "Andrew Peters" }, 
     //  new Person { FullName = "Brice Lambson" }, 
     //  new Person { FullName = "Rowan Miller" } 
     // ); 
     // 
    } 
} 

EF 마이그레이션을 사용할 때 큰 데이터 세트를 시드하는 몇 가지 옵션은 무엇입니까?

현재 구성 파일의 길이가 5000 줄을 넘으며 관리가 다릅니다.

나는 다른 데이터베이스에 저장하거나 스프레드 시트를 엑셀로 저장 한 다음 시드 기능을 사용하여 가져 오기를 원합니다. Seed 메서드 내에서 외부 소스에서 데이터를 가져 오는 방법을 모르겠습니다.

또한 여러 개의 파일로 데이터 세트를 침입하려고하지만 함수를 내가 빌드 오류가 구성 클래스의

SeedProducts(context); 
SeedFoods(context); 

외부 호출하려고하면 "이름이 아니라 존재 않습니다를 현재 상황 ". (이게 무슨 뜻인지 모르겠다.)

+0

백업 시드 (또는 백업 스크립트)를 저장 한 다음 (새) 시드 함수 내에서 해당 스크립트를 실행하는 것이 좋습니다. 웹 API 또는 검색 엔진에서 "수동으로"설정할 수있는대로 db를 시드 할 수 있습니다. – jpaugh

답변

2

sql 파일을 기본 디렉토리에 저장하고 사용할 수 있습니다. 여러 sql 파일을 만들 수 있습니다. 다음 코드를 사용하여 기본 디렉토리에 저장된 모든 sql 파일을 실행합니다.

protected override void Seed(CRM.Data.DbContexts.CRMContext context) 
     { 


      var sqlfiles = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory+"\\initialdata", "*.sql"); 
      sqlfiles.ToList().ForEach(x=> context.Database.ExecuteSqlCommand(File.ReadAllText(x))); 

     } 
1

우리는 5000 개 기록을 위해 시드 데이터를해야하는 이유.이 방법을 선호하는 경우도 수동 작업이 많이 소요됩니다. 여기서로서의하지 여기이 필요합니다. 즉시

당신은 스크립트를 작성하고 실행할 수 있습니다 그게 당신뿐만 아니라 수동으로뿐만 아니라 코드를 통해.

Db 스크립트는 전체 테이블뿐만 아니라 각 테이블에도 적용 할 수 있습니다. 그래서, 특히 레코드를 얻을 것입니다.

this link 또는 MSDN

주에서 단계를 수행를 데이터베이스 스크립트를 생성 한 후. 시드 함수에서 파일을 읽고 함수 자체에서 쿼리를 실행할 수 있습니다. 또는 수동으로 필요할 때 수동으로 실행하고 실행할 수 있습니다.

1

필자는 CSV (쉼표로 구분 된 파일)를 사용하여 도메인 리소스로 저장했습니다. CSV 파일을 읽고 데이터베이스 레코드를 추가하십시오.

Migration.cs 파일에서 다음과 같이 정의 된 EF Migration Seed method and a CSV file을 사용하여 데이터베이스를 시드 할 수 있습니다. 참고 : Visual Studio의 프로젝트에있는 CSV 파일은 Build Action to Embedded Resource로 설정됩니다.

public void SeedData(WebApp.Models.ApplicationDbContext Context) 
    { 
     Assembly assembly = Assembly.GetExecutingAssembly(); 
     string resourceName = "WebApp.SeedData.Name.csv"; 
     using (Stream stream = assembly.GetManifestResourceStream(resourceName)) 
     { 
      using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) 
      { 
       CsvReader csvReader = new CsvReader(reader); 
       csvReader.Configuration.WillThrowOnMissingField = false; 
       var records = csvReader.GetRecords<Products>().ToArray(); 

       foreach (Product record in records) 
       {        
         Context.Products.AddOrUpdate(record); 
       } 
      } 
     } 
     Context.SaveChanges(); 
    } 
관련 문제