2013-10-07 2 views
5

가 궁금하네요 파일. 내 ASP.NET MVC 웹 응용 프로그램에서 나는 때마다 데이터베이스 변경을 생성/코드 첫 번째 방법을 사용하여 삭제하고 있습니다 : 데이터베이스에서 데이터가 손실되기 때문에, 내가 가진, 다시 ETL하는,생성 종자 코드

#if DEBUG 
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDataContext>()); 
#endif 

그러나 어떤 성가시다.

DB는 모델 변경시에만 삭제되므로 어차피 내 ETL을 조정해야합니다. 하지만 차라리 DB 시드 코드를 변경하려고합니다.

모델과 SQL 테이블이 모두 최신이라고 가정하면 데이터베이스 내용을 가져 와서 시드 코드를 생성하는 방법을 아는 사람이 있습니까?

편집 1 : 나는 자동 생성 Configuration.cs, 그 종자 방법을 사용하고 데이터베이스에 데이터를 추가 할 AddOrUpdate() 방법을 사용할 계획입니다 : 여기에 (특히 "설정 Microsoft's Tutorial on migrations입니다 시드 방법 "섹션 참조).

+0

"시드 코드"는 무엇을 의미합니까? –

+0

제 질문에 대한 설명을 추가했습니다. –

답변

5

데이터를 시드하는 다른 방법은 위로 마이그레이션에서 SQL로 실행하는 것입니다.

는 내가 SQL 파일을 읽고 ETL 당신을 위해 SQL을 생성하는 경우가

using System; 
using System.Data.Entity.Migrations; 
using System.IO; 

public partial class InsertStandingData : DbMigration 
{ 
    public override void Up() 
    { 
     var baseDir = AppDomain.CurrentDomain 
           .BaseDirectory 
           .Replace("\\bin", string.Empty) + "\\Data\\Sql Scripts"; 

     Sql(File.ReadAllText(baseDir + "\\StandingData.sql")); 
    } 

    public override void Down() 
    { 
     //Add delete sql here 
    } 
} 

그럼 당신이 그 기술을 사용할 수있는 실행 코드가 있습니다. 위의 방법으로 그 일의

장점은

  1. 그것은 AddOrUpdate 데이터베이스에게 어떤 이미 존재하는 개체를 얻기 위해 호출 될 때마다 쿼리 AddOrUpdate 때문에 사용을하는 것보다 더 빨리 될 것입니다.
  2. 일반적으로 알려진 상태 (예 : 빈 테이블)에서 이동하기 때문에 은 이미 데이터가 있는지 여부를 확인할 필요가 없습니다. 주의 사항을 확인하려면 Down 메쏘드의 데이터를 삭제해야 눈물 흘려서 다시 백업 할 수 있습니다.
  3. 응용 프로그램이 시작될 때마다 Up 메서드가 실행되지 않습니다.

시드 방법은 편의성을 제공하며 이점이 있습니다 (!?)이 때마다 실행되는 응용 프로그램은

을 시작하지만 당신은 SQL을 실행하는 것을 선호하는 경우 ExecuteSqlCommand 대신 Sql의가 사용에서 :

string baseDir = AppDomain.CurrentDomain.BaseDirectory.Replace("\\bin", string.Empty) 
       + "\\Data\\Sql Scripts"; 
string path = Path.Combine(baseDir, "StandingData"); 
foreach (string file in Directory.GetFiles(path, "*.sql")) 
{ 
    context.Database.ExecuteSqlCommand(File.ReadAllText(file)); 
} 

참고 :

Best way to incrementally seed data

Preparing for database deployment

Database Initializer and Migrations Seed Methods

+0

Sql 메서드의 네임 스페이스는 무엇입니까? –

+0

그것은'DbMigration'와 같은 네임 스페이스에 있습니다! 대답을 편집하여 클래스를 표시하고 문장을 사용 – Colin

+0

그래서 위 및 아래 메소드는 데이터베이스 드롭에서만 실행됩니까? –

4

레코드가있는 간단한 데이터베이스 테이블이 있다고 가정 해 보겠습니다.

| Id | Age | FullName  | 
|------|-----|-----------------| 
| 1 | 50 | Michael Jackson | 
| 2 | 42 | Elvis Presley | 
| 3 | 48 | Whitney Houston | 
| ... | ... | ...    | 
| 3750 | 57 | Prince   | 

우리는 자동으로 생성 Configuration.cs 파일과 Seed() 방법을 사용하여 우리의 데이터베이스에이 테이블을 만들려고합니다.

protected override void Seed(OurDbContainer context) 
{ 
    context.GreatestSingers.AddOrUpdate(
      p => p.Id, 
      new GreatestSinger { Id = 1, Age = 50, FullName = "Michael Jackson" }, 
      new GreatestSinger { Id = 2, Age = 42, FullName = "Elvis Presley" }, 
      new GreatestSinger { Id = 3, Age = 48, FullName = "Whitney Houston" } 
      ); 
} 

이것은 사용자가해야 할 일입니다. 번!

하지만이 데이터는 이미 기존 데이터베이스 테이블에 있습니다. 따라서 개의 기존 데이터를 사용하여 Seed() 코드를 만들 수 있습니다.

SQL String Concatenation;

SELECT 
CONCAT('new GreatestSinger { Id = ', Id ,', Age = ', Age ,', FullName = "', FullName ,'" },') 
FROM GreatestSinger 

은 우리에게 데이터의 3750 행을 만드는 데 필요한 모든 코드를 제공 할 것입니다.

Seed() 방법으로 복사/붙여 넣기 만하면됩니다. 그리고 패키지 관리자 콘솔;

Add-Migration SeedDBwithSingersData 

Update-Database