2012-04-20 1 views
18

Entity Framework Code First를 사용하여 프로젝트를 시작했습니다. 준비가되면 데이터베이스와 코드를 호스트 공급자에게 업로드했습니다. 모든 것이 효과가있었습니다.MVC3 및 코드 첫 마이그레이션 - "데이터베이스가 생성 된 후 '어쩌구'컨텍스트를 지원하는 모델이 변경되었습니다."

내 클래스 중 하나에 새 필드를 추가해야하며 데이터베이스의 데이터를 잃어 버리고 싶지 않습니다. 따라서 코드 첫 마이그레이션을 사용하는 것에 대한 블로그 게시물을 몇 번 따라 보았습니다. 다음을 수행했습니다.

  1. 원격 (프로덕션) 데이터베이스를 백업했습니다.
  2. 나는 로컬이 데이터베이스를 첨부
  3. 내 클래스에 속성을 추가
  4. PM> 사용-마이그레이션
  5. PM> 추가 마이그레이션 AddSortOrderToCar
  6. PM> 업데이트 - 데이터베이스
  7. 을이 시점 I에서 로컬 데이터베이스의 .bak 파일을 만든 다음 해당 파일을 사용하여 원격 파일에 '복원'합니다.
  8. 마지막으로 원격 사이트에 코드를 게시했습니다.

나는 다음과 같은 오류 메시지가 사이트를 방문 : 데이터베이스가 생성 된 이후 는 'blahblah'컨텍스트를 백업 모델이 변경되었습니다. 코드 첫 번째 마이그레이션을 사용하여 데이터베이스를 업데이트하는 것이 좋습니다.

내가 뭘 잘못하고 있니?

답변

23

내 경험에 의하면 마이 그 레이션 테이블이 동기화되지 않은 경우 (데이터가 아닐지라도), 그리고 지금은 db 스키마의 일부분이었습니다 (시스템 테이블에서 생각한 4.3 이후).

문제가있는 부분은 수동/백업 코드를 사용하여 전체 데이터베이스를 복원의 조합입니다 함께 변경 ... 많은 이유와 그 오류를 경험하는 방법,하지만 대부분의 시간이있을 수 있습니다 - 난 항상 왜 그런지 완전히 확신하지 못합니다.

간략히 말하자면 Db-s가 동일한 마이그레이션 테이블 데이터가 아닐 수도 있고 해시 비교가 실패 할 수도 있습니다 (여전히 완전 복원은 충분히 좋아 보이지만 '양면'이 있음). 나를 위해 작동 무엇


는 '마이그레이션 차이'로 스크립트를 생성
Update-Database -Script

을 사용하는 것입니다 수동으로 대상 서버의 데이터베이스에 대한 SQL 스크립트로 적용 할 수 있습니다
(그리고 삽입 된 오른쪽 마이그레이션 테이블 행을 가져와야합니다.

여전히 작동하지 않는다면 다음 두 가지 작업을 수행 할 수 있습니다.

  1. 은 (목표를 - 시스템 테이블에서) - 마이그레이션 테이블을 제거 거기 http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspx 의견에 따라 - 이전 동작에 다시 실패하는 당신이 확신하는 경우 DB-의이 동일한 지 - 그것은 단지 내가 사용하는 최후의 수단으로, '당신을 신뢰'하는

  2. 가는 -
    INSERT INTO [__MigrationHistory] 기록을 찾을 수의 (a '전체 스크립트를'강제적으로 비어있는 DB를 초기화하여 예) 전체 스키마의 Update-Database -Script을,
    그냥 실행하고 데이터베이스에 삽입하십시오.
    ,451,515,및 데이터베이스 있는지 확인 - 확인해야합니다 및 코드 일치,

이 일이 다시 동기화 실행합니다.

(면책 조항 :이, 로컬 시나리오 주어진 몇 가지를 시도해야 할 수있는 모든 시간에 일할 수있는 방탄되지 않습니다 -하지만 동기화를 얻어야한다)

+1

'업데이트 - 데이터베이스 -Script은'했다. 나는 'Update-Database'명령이 똑같은 일을했을 것이라고 생각했지만 스크립트를 생성하지는 않았다. 어쨌든. 감사! –

+1

@ScottDietrich - np - 음, 그래야하지만 모든면에서 동기화를 유지해야합니다 (예 : 마이 그 레이션은 로컬 DB 등의 '상태'를 기반으로 생성됩니다). 따라서 마이 그 레이션이 '로컬' db vs code - 일단 '움직이는 것을 밖으로 시작'하면 더 많은 기회가 있습니다. 당신이 서버에 dev 설정을하지 않는 한, SQL 스크립트는 더 안전한 방법으로 밝혀졌습니다. (적절한 위치에 마이 그 레이션을 수행 할 수 있도록) – NSGaga

+0

일부 마이 그 레이션이있는 DB가 있습니다. 실행되었지만 __MigrationHistory 테이블의 레코드가 동일한 마이그레이션이 다시 실행되는 것을 중지하지 않았습니다. __MigrationHistory 테이블의 모든 행을 삭제 한 다음 -Script 명령에 의해 수동으로 생성 된 INSERT INTO [__MigrationHistory] 행을 삽입했습니다. 마이그레이션 기록이 다시 나타납니다. 매우 유용한 답변을 주셔서 감사합니다 @ NSGaga! –

관련 문제