2012-03-29 3 views
6

을 사용하여 최근에 만든 데이터베이스의 로컬 인스턴스가 있으므로 테이블에 코드가 일치하는 InitalCreate 항목이 있습니다.EF4.3 코드 첫 번째 마이그레이션에서 보류중인 마이그레이션을 무시합니다.

그러나 일부 코드 기반 마이그레이션은 마이그레이션 폴더에 있습니다. 이는 개발 및 스테이징 환경에서 실행되어 해당 데이터베이스를 코드와 일치하게 만듭니다. 그러나 현재 코드를 사용하여 데이터베이스를 만들었으므로 로컬로 적용 할 필요가 없습니다.

이제 모델을 변경하고 해당하는 마이그레이션을 만들어야합니다. 내가 Add-Migration TestMigration을 실행할 때, 나는 다음과 같은 오류 나는이 경우 어떻게해야

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
201203290856574_AlterColumnY] 

Apply the pending explicit migrations before attempting to generate 
a new explicit migration. 

거야? 다른 버전의 환경에서 Add-Migration 도구를 가리킬 수 없습니다. 버전이 로컬에있는 것과 일치한다는 보장이 없기 때문입니다. 내가 만든 변경 사항과 만 일치하는 마이그레이션을 원합니다.

내가 몇 가지 옵션이 보이지만 아무도 이상적인 없습니다 :

  1. 다음 이전 마이그레이션을 복원, 추가 마이그레이션 명령을 실행 마이그레이션 폴더에서 다른 마이그레이션을 삭제하여 데이터베이스를 업그레이드합니다. 이것은 간단하지만 약간 hackish 보인다.
  2. 첫 번째 마이그레이션이 적용된 소스 컨트롤의 모델 버전으로 되돌리고 빌드 한 다음 데이터베이스를 만드는 데 사용하십시오. 그런 다음 최신 버전을 구해서 모든 마이그레이션을 적용한 다음 마이그레이션을 추가 할 준비가되었습니다. 이것은 많은 노력처럼 보인다!
  3. 수동으로 마이그레이션을 만듭니다.

누구에게 관리하는 방법에 대한 제안 사항이 있습니까? 우리는 귀하의 옵션 # 1의 변형을 사용할 계획

답변

2

가 가장 적합한 문제 해결은 매우 간단 실행되도록 설정 한 후 DbContext.Database.Create()를 사용하지 않는 마이그레이션. 프로그래밍 방식으로 새 데이터베이스를 만들려면 대신 migrations API를 사용하십시오.

var migrator = new DbMigrator(new Configuration()); 
migrator.Update(); 

그런 다음 전체 마이그레이션 기록을 가져오고 추가 마이그레이션을 추가하면 예상대로 작동합니다.

2

...

우리의 표준 운영 절차는 순서대로, (갱신 데이터베이스의 -script 옵션을 사용하여) 각각의 마이그레이션을위한 SQL 스크립트를 생성하는 것입니다 InstallShield에 의해 최종 사용자 "프로덕션"데이터베이스에 적용될 SQL 스크립트를 가질 수 있습니다 (개발자 데이터베이스에만 EF 업데이트 데이터베이스 사용 예정).

따라서 Migrations 폴더의 모든 마이그레이션에 대해 .cs 파일과 해당 .sql 파일이 있습니다.

# 1에서 제안한대로 마이그레이션 폴더에서 마이그레이션을 삭제하는 대신 SQL Mgmt Studio를 사용하여 _MigrationHistory에 삽입을 수행하는 .sql 파일의 일부만 수동으로 적용합니다.

로컬 데이터베이스의 _MigrationHistory가 이미 해당 데이터베이스에 통합 된 변경 사항을 최신 상태로 만듭니다.

하지만 그것은 골치 거리이며, 우리는 여전히 더 나은 해결책을 찾고 있습니다.

DadCat

1

나는이 문제를 경험했다. 당신은 실행하면

Update-database 

다음

Add-Migration YourMigrationName 

이것은 내가 찾은 무엇

+1

'DbContext.Database.Create()'를 사용하여 생성 된 데이터베이스에서 이전 마이그레이션 작업을 실행할 수 없기 때문에이 작업이 수행되지 않습니다. 컬럼을 추가하는 마이그레이션을 상상해보십시오. 그러나 새 로컬 데이터베이스에서 이미 그 컬럼을 가지고 있기 때문에'SqlException'을 얻을 수 있고 관련 행은 절대로'__MigrationHistory' 테이블에 추가되지 않습니다. 올바른 접근이라고 생각하는 것에 대한 제 대답을보십시오. –

1

변경 사항을 데이터베이스로 푸시하려면 패키지 관리자 콘솔에서 "update-database"을 실행하거나 Migrations 폴더에서 보류중인 마이그레이션 파일 ([201203271113060_AddTableX])을 삭제 한 다음 "add-migration "편집을 기반으로 완전히 새로운 마이그레이션을 만듭니다.

0

은 이전 마이그레이션 파일을 솔루션 파일에서 제외하기 만하면됩니다.

관련 문제