2017-12-19 16 views
3

나는 약간의 피클에 빠져있다.명시 적 마이그레이션에서 자동 마이그레이션을 캡처하기위한 최소한의 방법?

  • 자동 마이그레이션이 처음
  • 일부 명시 적 마이그레이션이
  • 자동 마이그레이션 후했다
  • 을 해제 추가 된 추가 된
  • 일부 자동 마이그레이션 켜져 있었다 : 나는 EF를 사용하여 프로젝트를 상속했습니다

이 코드가 배포 된 컴퓨터가 dev 컴퓨터와 병렬로 이동 했으므로 아무 것도 손상되지 않으므로 모든 컴퓨터가 정상적으로 작동합니다.

다른 컴퓨터에 배포 한 경우 명백한 마이그레이션 만 적용됩니다. 사실, 나는 신선한 dev에 시스템에서 프로젝트를 실행하려고 할 때 이것이 사실이라는 것을 알았다.

이제는 SQL 작성 스크립트를 생성하고이를 새로운 시스템에서 실행함으로써 실행을 방해 할 수있었습니다. 분명히 이것은 장기적인 해결책이 아닙니다.

내가 볼 수있는 한 가지 옵션은 모든 마이그레이션과 마이그레이션 기록 (__MigrationHistory) 테이블을 지우고 모든 "커버리지"마이그레이션을 생성하는 것입니다. 이 문제는 필자가 프로덕션 서버를 포함하여 코드를 실행하는 모든 시스템에서이 수술을 수행해야한다는 것입니다.

완전히 새로운 환경에서만 실행되는 새 명시 적 마이그레이션으로 초기 자동 마이그레이션을 소급하여 캡처 할 수있는 방법이 있습니까?

+0

모든 것이 동기화되어 있다면 제안한대로 이전을 재설정하십시오. 새로운 기준선 ('Add-Migration NewBaseline -IgnoreChanges')을 수립하고 앞으로 나아가는 마이그레이션을 추적하십시오. 우리는이 일을 여러 번 해 봤습니다. –

답변

0

데이터베이스를 수동으로 업데이트 할 수있는 능력이 있다면 Update-Database -Script을 실행하는 것입니다. 그런 다음 각 마이그레이션 (자동 작업 포함)과 SQL 명령이 순서대로 적용될 때이를 볼 수 있습니다. 다음 단계에서 필요하기 때문에 전체 SQL 파일을 저장하십시오.

다음으로 거대한 Base64 문자열을 포함하는 INSERT 명령으로 구분되는 각 명령 블록을 살펴보십시오. 자동 마이그레이션을 포함하여 각 마이그레이션 단계가 분리되어 순서대로 배치되어 있음을 알 수 있습니다. 이 쌍 각각에 대해 우리는 INSERT 명령 위의 모든 내용과 마지막 마이그레이션의 INSERT 명령 아래 필요한 모든 항목을 필요로합니다. 이러한 작업을 마이그레이션 작업이라고합니다. 부여

는,이 규모에서 시간이 좀 걸릴 것입니다,하지만 다음 실행 Add-Migration -IgnoreChanges 새로운 Sql() 작업을 추가 Up() 방법으로 빈 상태 (empty)의 마이그레이션을 스캐 폴딩하고 그것으로 (즉, Sql("<your_awesome_script>"))를 현재 마이그레이션 작업을 복사하는 것을 알고 있습니다. 안전을 위해 해당 Down()을 작성해야 할 수도 있습니다.

다음으로 돌아가서 작업중인 자동 작업 전후의 마이그레이션의 TimeStamps를 확인하십시오. 이 명령은 INSERT 명령의 첫 번째 매개 변수는 201710152132114_<MigrationName>입니다. 이 둘 사이에 DateTime을 선택하고 해당 DateTime을 사용하여 새 마이그레이션의 .cs 파일 이름을 지정하십시오. 이렇게하면 나중에 사용할 수 있도록 솔루션 내부에서 올바르게 이전 할 수 있습니다.

마지막으로, 이전의 .Designer.cs 파일을 열고 get에하여 ImigrationMetadata.Id 기존 Id 문자열 당신이 만든 새 마이그레이션 이름을 교체의 내부. 이것이 EF가 프로그래밍 작업을 통해 마이그레이션 작업을 주문하는 방식입니다.

이미 일부 마이그레이션이 적용된 새 시스템으로 이동하는 경우 사용중인 데이터베이스의 인스턴스를보고 __MigrationHistory 테이블에있는 최신 항목의 ID가 무엇인지 확인하십시오. 그런 다음 개발 환경에서 마이그레이션 대상을 으로 되 돌린 후으로 마이그레이션하고 각 자동에 대해 위에 나열된 단계를 따르십시오. 이처럼 모든 자동 마이그레이션을 한 번에 변환 할 수 있다면 앞으로 모든 명시 적 마이그레이션을 새로운 환경에 배포 할 수 있습니다.

개발 환경과 테스트 환경에서 작업 할 때까지는 프로덕션 시스템에서이 작업을 시도하지 않는 것이 좋습니다.

+0

감사합니다. 아직 시도하지는 않았지만 작동 방법을 알 수 있습니다. 나는이 클래스가 "최소한의 파괴적"이라고 생각하지는 않지만, 파괴적인 방법이라면 반드시해야 할 것입니다. –