2013-03-22 1 views
6

AutomaticMigrationsEnabled = false으로 간단한 마이그레이션을 설정했습니다. 모든 것은 Visual Studio 또는 MigrateDatabaseToLatestVersion을 사용할 때 잘 작동합니다.Entity Framework 마이그레이션 - 마이그레이션이 없어도 시드가 실행됩니까?

그러나 이것은 이상적인 방법이 아닙니다. 내 ci 서버의 배포 스크립트에서 마이그레이션을 실행하고 싶습니다. 나는 this article을 사용하는 방법을 설명했다. 그러나 이것은 항상 씨를 실행하는 것 같다. 적용 할 마이그레이션이없는 경우에도 마찬가지입니다.

마이그레이션을 실행했는지 Seed 메서드 내에서 프로그래밍 방식으로 확인해야합니까? 어떻게해야합니까?

+0

왜 종자 멱등 원을 만들지 않으십니까? –

+0

@LukeMcGregor - 명시 적으로 하드 코딩 키를 사용하지 않거나 upsorts에 대한 각 테이블에서 작성된 검사를 실행하지 않고 데이터를 삽입하려면 어떻게해야합니까? –

+1

개인적으로 씨앗 데이터에 대한 하드 코드 키, 그 씨앗의 정적 인 어쨌든 주어진 IMO –

답변

5

보류중인 마이그레이션이있는 경우에만 DbMigrator을 사용하여 수동으로 Update()를 실행하십시오. Entity Framework 5.0에서 소개되었습니다.

private void MigrateAndSeedDbIfSchemaIsOutdated() 
{ 
    // Disable initializer. 
    Database.SetInitializer<MyContext>(null); 

    // Make sure database exists. 
    using (var db = new MyContext()) 
    { 
     db.Database.Initialize(false); 
    } 

    var migrator = new DbMigrator(new MyConfiguration()); 

    if (migrator.GetPendingMigrations().Any()) 
    { 
     // Run migrations and seed. 
     migrator.Update(); 
    } 
} 
+0

아, 그 방법에 대해 감사합니다! LINQ에 대한 메모 - 여기서 ToList를 호출 할 필요가 없습니다. 단순히 pendingMigrations를'IEnumerable <>'로두고'.Any() '를 호출하면됩니다. 'ToList'를 호출하면 전체 열거 형을 강제로 평가하는 반면, 적어도 하나의 항목 만 있는지를 신경 써야합니다. –

+0

맞습니다. 저는 그 부분을 디버깅에 사용했습니다. 나는 대답을 편집했다. – angularsen