이 질문은 데이터를 신경 쓰지 않음으로써 전제되지만 때로는 데이터 유지 관리가 필수적입니다.
그렇다면 데이터베이스에 이미 같은 이름의 테이블이있을 때 Entity Framework 악몽에서 복구하는 방법에 대한 단계 목록을 작성했습니다. Entity Framework 악몽 에서 복구하는 방법-데이터베이스에 이미 같은 이름의 테이블이 있습니다.
분명히 ... 중재자가 게시물을 삭제하기에 적합하므로 여기에 붙여 넣을 것입니다.
Entity Framework 악몽에서 복구하는 방법-데이터베이스에 이미 동일한 이름의 테이블이 있습니다.
설명 : 팀이 EF를 처음 접했을 때 우리와 같다면 새 로컬 데이터베이스를 만들 수 없거나 프로덕션 데이터베이스에 업데이트를 적용 할 수없는 상태가됩니다. 깨끗한 EF 환경으로 돌아간 다음 기본 사항을 고수하고 싶지만 할 수는 없습니다. 프로덕션 환경에서 작동하게되면 로컬 DB를 만들 수 없으며 로컬 환경에서 작동하면 프로덕션 서버가 동기화되지 않습니다. 마지막으로 프로덕션 서버 데이터를 삭제하고 싶지 않습니다.
증상 : 생성 스크립트를 실행하려고하는데 데이터베이스에 이미 같은 이름의 테이블이 있으므로 Update-Database를 실행할 수 없습니다 .
오류 메시지 : System.Data.SqlClient.SqlException (0x80131904) : 데이터베이스에 ''라는 이름의 개체가 이미 있습니다.
문제 배경 : EF는 dbo .__ MigrationHistory라는 데이터베이스의 테이블을 기반으로 코드가있는 위치와 현재 데이터베이스의 위치를 이해합니다. 마이그레이션 스크립트를 볼 때 스크립트와 함께 마지막 위치를 재조정하려고합니다. 그것이 가능하지 않다면, 순서대로 적용하려고 시도합니다. 즉, 초기 작성 스크립트로 돌아가서 UP 명령의 첫 번째 부분을 보면 오류가 발생한 테이블의 CreeateTable이됩니다.
이것을 더 자세히 이해하려면 여기에 언급 된 두 비디오를 모두 보는 것이 좋습니다.
https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx
솔루션 : 우리가해야 할 일은 이러한 CreateTable 명령을 적용하지 않고 현재 데이터베이스가 최신 상태라고 생각하도록 EF를 속이는 것입니다. 동시에, 우리는 여전히 새로운 로컬 데이터베이스를 만들 수 있도록 이러한 명령이 존재하기를 원합니다.
1 단계 : 프로덕션 DB 정리
먼저 프로덕션 DB를 백업합니다. SSMS에서 데이터베이스를 마우스 오른쪽 단추로 클릭하고 "작업> 데이터 계층 응용 프로그램 내보내기 ..."를 선택하고 지시를 따릅니다. 프로덕션 데이터베이스를 열고 dbo .__ MigrationHistory 테이블을 삭제 / 삭제하십시오.
2 단계 : 로컬 환경 정리
마이그레이션 폴더를 열고 삭제하십시오. 필요한 경우 git 에서이 모든 것을 다시 얻을 수 있다고 가정합니다.
3 단계 : 초기 다시 작성
패키지 관리자에서 "Enable-Migrations"를 실행하십시오 (여러 컨텍스트가있는 경우 EF는 -ContextTypeName을 사용하도록 프롬프트합니다). "Add-Migration Initial -verbose"를 실행하십시오. 현재 코드를 기반으로 처음부터 데이터베이스를 작성하는 초기 스크립트를 작성합니다. 이전 Configuration.cs에 시드 작업이있는 경우 시드 작업을 복사하십시오.
4 단계 : EF 트릭
이 시점에서 Update-Database를 실행 하면 원래 오류가 발생합니다. 따라서 이러한 명령을 실행하지 않고 EF가 최신 상태라고 생각하도록 속 여야합니다. 방금 생성 한 초기 마이그레이션에서 Up 메소드로 이동하여 주석 처리하십시오.
5 단계 : 데이터베이스 업데이트
Up 프로세스에서 실행할 코드가 없으면 EF는이 스크립트를 올바르게 실행했다고 말하는 올바른 항목이있는 dbo .__ MigrationHistory 테이블을 만듭니다. 원하는 경우 가서 확인하십시오. 이제 해당 코드의 주석을 해제하고 저장하십시오. EF가 최신 상태인지 확인 하려면 Update-Database를 다시 실행할 수 있습니다 . 이미 완료했다고 생각하기 때문에 모든 CreateTable 명령으로 Up 단계를 실행하지 않습니다.
6 단계 : EF가 실제로 최신 상태인지 확인
아직 마이그레이션을 적용하지 않은 코드가있는 경우이 작업을 수행했습니다.
"Add-Migration MissingMigrations"를 실행합니다. 실제로 빈 스크립트가 생성됩니다. 코드가 이미 존재했기 때문에 초기 마이그레이션 스크립트에서 이러한 테이블을 작성하는 올바른 명령이 실제로 있었으므로 CreateTable 및 이와 동등한 삭제 명령을 Up 및 Down 메소드로 잘라 냈습니다.
이제 Update-Database를 다시 실행하고 새 마이그레이션 스크립트를 실행하여 데이터베이스에 적절한 테이블을 작성하십시오.
7 단계 : 재확인 및 커밋
빌드, 테스트, 실행 모든 것이 실행 중인지 확인한 다음 변경 사항을 커밋하십시오.
8 단계 : 팀원들에게 진행 방법을 알려주십시오.
다음 사람이 업데이트 할 때 EF는 이전에 실행 한 스크립트가 존재하지 않으면 어떤 공격이 발생했는지 알 수 없습니다. 그러나 로컬 데이터베이스를 날려 버리고 다시 만들 수 있다고 가정하면 이것으로 충분합니다. 로컬 데이터베이스를 삭제하고 EF에서 다시 작성해야합니다. 로컬 변경 및 보류중인 마이그레이션이있는 경우 마스터에서 DB를 다시 작성하고 기능 분기로 전환 한 후 마이그레이션 스크립트를 처음부터 다시 작성하는 것이 좋습니다.
DROP DATABASE
....