엔티티 프레임 워크에서 명시 적 마이그레이션을 생성 할 수 없습니다.


96

새 마이그레이션을 추가하고 있지만이 메시지는 다음과 같습니다.

다음 명시 적 마이그레이션이 보류 중이므로 명시 적 마이그레이션을 생성 할 수 없습니다. [201203170856167_left]. 새 명시 적 마이그레이션을 생성하기 전에 보류중인 명시 적 마이그레이션을 적용하십시오.

아무도 나를 도울 수 있습니까?


11
실수로 시작 프로젝트를 다른 프로젝트로 전환했을 때 이런 일이 발생했습니다. 당신 (또는이 글을 읽는 다른 사람들)은 좀 더 심층적 인 문제 해결 (특히 마이그레이션 삭제를 시작해야하는 경우)을 시도하기 전에 빠르게 확인하는 것이 좋습니다.
NicholasFolk

데이터베이스의 _MigrationHistory에서 업데이트되지 않은 Migrations 디렉터리에 마이그레이션 클래스가 있습니다. 마이그레이션 디렉토리와 데이터베이스에서 동일한 상태를 갖도록 해당 클래스를 제거하면 문제가 해결되었습니다.
Aryan Firouzian

1
이것은 나에게 무작위로 발생합니다. 이 경우 모든 마이그레이션을 적용해야한다는 메시지가 표시됩니다. 이미 모든 것이 제대로 설정되어 있기 때문에 Visual Studio를 다시 시작해야 작동합니다.
Larry Flewwelling

답변:


81

애플리케이션에 처리되지 않은 마이그레이션이 있으며 Update-Database다른 마이그레이션을 추가하기 전에 실행 해야 함을 알려줍니다 .


12
초기 마이그레이션을 다시 생성 하시겠습니까? 이로 인해 그렇게 할 수 없습니까?
Rebecca

나를 위해 작동하지 않았습니다 .Update-Database에서 또 다른 오류가 발생했습니다. 먼저 보류중인 파일을 삭제해야했습니다.
Vahx

1
Thomas의 대답은 비슷한 경우에 유용했습니다.
Tarek Shawadfy 2015

2
스타트 업 프로젝트를 선언해야 할 수도 있습니다-StartupProject ContentHub.Database
osanger

2
Update-Database제공> Unable to update database to match the current model because there are pending changes
ASpirin

53

나는 같은 문제가 있었다. 분명히 엔티티 프레임 워크는 데이터베이스에 연결할 수 없을 때이 오류를 생성합니다. 따라서 다른 문제를 검색하기 전에 액세스 할 수 있는지 확인하십시오.


1
또한 App.config를 다른 프로젝트로 옮길 때 또는 프로젝트에서 단순히 누락되었거나 프로젝트에 있지만 잘못 구성된 경우에 해당한다고 덧붙일 것입니다.
Code Maverick

내 IP가 변경된 후에도 동일한 오류가 발생했습니다 (위치 전환 후와 dyn dns 변경 후 모두 발생). 이로 인해 로그인을 취소하는 데 사용하는 Azure 데이터베이스의 방화벽이 발생했습니다. 도움이되지 않는 EF 마이그레이션은 "로그인 할 수 없음"대신 위의 오류를 표시합니다 ...
Victor

8
내가 만들고 싶은 또 다른 요점은 시작 프로젝트가 db 컨텍스트의 연결 문자열이 있는지 확인하는 것입니다. 일시적으로 시작 프로젝트를 변경하고 다른 프로젝트에 동일한 연결 문자열이 없다는 것을 알지 못했을 때이 문제가 발생했습니다.
Gage Trader

@GageTrader에 추가하기 : 구성이없는 여러 개의 시작 프로젝트와 EF-config가있는 웹 프로젝트가 있습니다. 마이그레이션이있는 (Repository) 프로젝트의 app.config에 웹 프로젝트와 동일한 EF 구성이 있습니다. 하지만 저장소 프로젝트를 시작 프로젝트로 선택해도 작동하지 않았지만 웹 프로젝트를 시작하도록 설정하면 작동했습니다.
JimiSweden

나는 명시 적으로 나를 위해 트릭을했던 -ConnectionString 매개 변수 명시했다
브라이언 Colavito

34

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


1
마이그레이션 파일을 삭제하고 추가 마이그레이션을 실행했지만 여전히 동일한 오류가 발생합니다.
nu everest 2014 년

2
감사합니다, 보류중인 마이그레이션 파일을 삭제하는 방법에 대한 팁은 생명의 은인이었다
마니

31

이 오류는 마이그레이션이 더 이상 인식되지 않음을 의미 할 수도 있습니다. 이것은 Migrations.Configuration에서 ContextKey의 값을 변경 한 후 나에게 발생했습니다. 해결책은 단순히 데이터베이스 테이블 "__MigrationHistory"에서 ContextKey를 업데이트하는 것입니다 (또는 내가 추측하는 Configuration 클래스의 값을 되돌림). 애플리케이션의 ContextKey와 네임 스페이스가 일치해야합니다.


1
제 사건에 대한 정답이었습니다. 비슷한 새 프로젝트에 이전 프로젝트 중 하나를 사용했기 때문에 이전 마이그레이션을 통해 DB를 변경할 수 없었습니다. Thomas가 제안했듯이 네임 스페이스는 _MigrationsHistory 테이블의 Contextkey에서 마이그레이션이 다르기 때문에 이전 마이그레이션이 인식되지 않습니다.
Tarek Shawadfy 2015

1
솔루션 이름을 변경하여 문제를 일으켰 기 때문에 도움이되었습니다. 이 과정에서 ContextKey의 이름을 변경하여 더 이상 _MigrationHistory 항목과 일치하지 않게했습니다.
Joel

또한 나를 위해 일하고 구성에 명시 적 컨텍스트 키를 설정하고 __MigrationHistory에서 변경했으며 업데이트 데이터베이스는 모든 것이 멋지다고 결정했습니다. 감사!
James White

2
말도 안되지만 맞습니다. 프로젝트 이름을 업데이트했거나 프로젝트 (내 경우)를 몇 개로 분할하고 새 프로젝트에서 동일한 db로 새 마이그레이션을 추가하려는 경우 올바른 ContextKey를 사용해야하며 구성 생성자 ( 대상 DB의 __MigrationHistory 테이블에있는 컨텍스트 키를 사용해야합니다.)
BotanMan

여기서도 동일하게 기본 네임 스페이스의 이름을 변경하고이 문제를 일으킨 솔루션 전체에서 교체했습니다.
WtFudgE

18

1. 연결 문자열 / 연결 권한

연결 문자열을 다시 확인하십시오.

연결중인 사용자에게 여전히 읽기 [__MigrationHistory]권한과 스키마 편집 권한 이 있는지 확인하십시오 .

통합 보안 (Windows Auth)을 사용하여 add-migration 명령을 직접 실행하도록 앱 또는 웹 구성 파일의 연결 문자열을 변경해 볼 수도 있습니다 .

예를 들면 :

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

이 연결 문자열은 DbContext가있는 프로젝트의 App.config 파일에 저장됩니다.

2. 시작 프로젝트

명령 줄에서 시작 프로젝트를 지정하거나 DbContext, Configuration및 마이그레이션 폴더가 있는 프로젝트를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택할 수 있습니다. 나는 진지하다. 이것은 실제로 도움이 될 수있다.

여기에 이미지 설명 입력


ㅋ. 나는 이것이 더 많은 투표를 얻길 바랍니다. 이것은 나에게 많이 발생하며 Integrated Security수정은 훌륭하게 작동합니다!
Jess

1
나는 같은 문제가 있었고 마이그레이션 명령이 작동하지 않았습니다. 시작 프로젝트를 설정하지 않는 것이 범인이었습니다. 내 문제를 해결하는 설정.
Vishal

시작 프로젝트를 변경하는 것이 저에게 효과적이었습니다! 나는 그것이 작동하지 않을 것이라고 확신했지만 다른 모든 것이 실패했기 때문에 어쨌든 시도했습니다. 좋은 대답입니다.
Sylvain Rodrigue

"시작으로 설정"- 결코 추측 하지 못했을 것입니다! 감사합니다!!
Jasel

1
네, 의도적으로 시작 프로젝트를 변경했으며 다시 변경하는 것을 잊었습니다. 그리고 재미있는 것은 이전에 한 번의 마이그레이션이 적절한 시작 프로젝트로 수행되었으므로 모든 것이 잘 작동한다는 것입니다. 그러나 이것은 이제 논리적입니다. b / c EF는 프로젝트에서 연결 문자열을 가져
오므

8

같은 문제가 있었고 위의 답변에서 몇 가지 힌트로 해결할 수있었습니다.

  • 패키지 관리자 콘솔에서 기본 프로젝트를 확인합니다 (마이그레이션 구성이있는 프로젝트를 가리 킵니다.
  • startup-proj에 유효한 연결 문자열이있는 web.config가 있는지 확인하십시오 (또는
  • 마이그레이션이있는 프로젝트에 유효한 연결 문자열이있는 app.config / web.config가 있는지 확인하십시오.
  • DB에서 권한 확인 (연결 문자열에 구성된 사용자에 대해)

패키지 관리자 콘솔에서 "update-database -verbose"를 사용하여 마이그레이션이 연결을 시도하는보다 구체적인 정보를 얻으십시오. (내 경우에는 시작 프로젝트가 올바르게 설정되지 않았 음을 확인하는 데 도움이되었습니다 ...)


2
"update-database -verbose"를 실행하고 연결 문자열이 끊어진 것을 발견했습니다. 따라서 add-migration 명령은 잘못된 메시지를 제공합니다.
Wachburn 2016

4
"시작 proj {...}"가 내 문제를 해결했는지 확인합니다. 덕분에 @flex
앤디 슈미트에게


7

이 문제가 발생하면 add-migration cmdlet에 매개 변수를 추가해보십시오. 예를 들어 시작 프로젝트와 연결 문자열 이름을 지정하면 EF가 대상 데이터베이스를 찾는 데 도움이 될 수 있습니다.

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

어디:

Delta_Defect_0973 은 마이그레이션의 이름입니다.

your.namespace.ContextClassName 은 마이그레이션 폴더에있는 구성 클래스의 이름이며 전체 이름 공간이 접두어로 붙습니다.

DeltaProject 는 web.config 또는 app.config 파일이있는 기본 프로젝트의 이름입니다.

DeltaSQL 은 web.config 또는 app.config 파일에 정의 된 연결 문자열의 이름입니다.


감사. 이것은 정말 나를 도왔습니다.
Jess

또한 솔루션에서 종속성 주입을 사용하는 경우 패키지 관리자 콘솔에서 다른 기본 프로젝트를 선택해야 할 수 있습니다. EF가 마이그레이션을 찾을 수없는 경우 실제로 마이그레이션이 포함 된 프로젝트를 기본 프로젝트로 선택해보십시오.
Yves Rochon 16.

5

이 오류는 다른 명시 적 마이그레이션을 실행하기 전에 커밋해야하는 보류중인 마이그레이션이 있음을 의미합니다. 당신은 선택할 수 있습니다

  1. Update-Database 명령을 사용하여 보류중인 마이그레이션 실행
  2. 보류중인 마이그레이션을 삭제하십시오. 가장 안전한 방법은 마이그레이션 폴더를 열고 [201203170856167_left]> 프로젝트에서 제외를 마우스 오른쪽 버튼으로 클릭하는 것입니다.

이 후에 "Add-Migration ..."을 다시 시작할 수 있습니다.

도움이되기를 바랍니다.


4

내 2 센트 :

내 시나리오 :

  1. 로컬 데이터베이스를 작동 상태로 복원했습니다.
  2. 이미 마이그레이션이 적용되었습니다.
  3. 새 마이그레이션을 추가하려고 할 때마다 OP에서 언급했듯이 보류중인 마이그레이션에 대한 오류가 발생했습니다.

해결책:

이 문제를 해결하기 위해 더 명시적인 매개 변수를 제공했습니다.

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

이 동작을 기본값으로 허용하도록 app.config 폴더에 설정을 설정할 수 있으므로 매번 명시적인 매개 변수를 제공 할 필요가 없습니다. 그러나 나는 이것을하는 방법을 잘 모르겠습니다.


1
이것은 나를 위해 일했으며 위에 표시된 명령 끝에 마이그레이션 이름을 추가했습니다.
sfors는 분석 재개 모니카 말한다

1
=)-도와 드릴 수있어서 기쁩니다.
IbrarMumtaz

1
-ConnectionStringName이 대안이며, 이름으로 설정에서 연결 문자열을 가져옵니다
Simon_Weaver

1
나는 설정 파일에 연결 문자열을 저장하고 있지 않다 때문 도와주었습니다
Sasinosoft

3

모호함과 오류가 있습니다. 가장 좋은 방법은 현재 마이그레이션 파일을 제외하고 새 마이그레이션 ( add-migration ) 파일을 만든 다음 새 마이그레이션의 내용을 제외 된 파일에 복사하고 다시 포함하고 update-database 명령을 실행하는 것입니다.


난 그냥 실행 update-database한 후 명령을 내 시도 add-migration명령을하며 일
스미 티 - WERBEN-야거-Manjenson을

3

나는 다음과 같은 문제를 해결했습니다.

  • 이전 마이그레이션 파일 삭제
  • 업데이트 데이터베이스 -force
  • 추가 마이그레이션 AddedEntity
  • 데이터베이스 갱신

1

나는 같은 문제가 있었고 Add-Migration 'MigrationName'-Force를 실행해야만 해결할 수있었습니다.

-Force가 중요한 부분입니다.


1

내 로컬 데이터베이스가 __MigrationHistory채워 지지 않았 거나 존재 하지 않았습니다 . 수동으로 테이블을 만든 다음 해당 테이블의 데이터를 PROD에서 내 로컬 데이터베이스로 마이그레이션했습니다. 이로 인해 VS는 마이그레이션이 적용되었다고 생각했습니다.


동일한 문제가 발생하여 라이브 DB를 프로덕션에 병합했지만 마이그레이션 기록이 손실되었습니다.
matthy

1

팁 :-Script 확실하지 않은 경우 마이그레이션 명령에 항상 스위치 를 사용하는 것이 좋습니다 . 또한 Update-Database실제로 무엇을하는지 이해하는 데 도움 이됩니다.

다음을 실행하여 데이터베이스를 업데이트 한 다음 수동으로 적용 할 수있는 스크립트를 얻거나 -Script 태그없이 다시 실행합니다.

들어 Update-Database나는 다음을 실행합니다 :

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

SQL_AzureLive내 구성에서 명명 된 연결 문자열은 어디에 있습니까 ?

그런 다음 SQL이 올바른지 확인하고 적용하여 수행 할 수 있습니다. 다른 많은 사람들이 연결 문자열이 잘못되었거나 유효하지 않다고 말했듯이이 오류가 발생합니다.


1

나를 위해 Migrations폴더 에서 마이그레이션 파일 (귀하의 경우 "201203170856167_left")을 삭제 한 다음 패키지 관리자 콘솔에서 아래 명령을 실행했습니다.

Add-Migration <Parameter>
Update-Database

0

대본

  • 새 DB 마이그레이션을 생성 한 지점에서 일하고 있습니다.
  • master에서 업데이트 할 준비가되었지만 master에도 최근 DB 마이그레이션이 있습니다.
  • 충돌을 방지하기 위해 브랜치의 db 마이그레이션을 삭제합니다.
  • 나는 "마스터로부터 업데이트".

문제

마스터에서 업데이트 한 후 "Add-Migration my_migration_name"을 실행했지만 다음 오류가 발생합니다.

다음 명시 적 마이그레이션이 보류 중이므로 명시 적 마이그레이션을 생성 할 수 없습니다. [201607181944091_AddExternalEmailActivity] 새 명시 적 마이그레이션을 생성하기 전에 보류중인 명시 적 마이그레이션을 적용하십시오.

그래서 "Update-Database"를 실행하면 다음과 같은 오류가 발생합니다.

보류중인 변경 사항이 있고 자동 마이그레이션이 비활성화되어 있으므로 현재 모델과 일치하도록 데이터베이스를 업데이트 할 수 없습니다.

해결책

이 시점에서 "Add-Migration my_migration_name"을 다시 실행하면 문제가 해결되었습니다. 내 이론은 "Update-Database"를 실행하면 "Add-Migration"이 작동하는 데 필요한 모든 상태가됩니다.


0

나는 또한이 문제를 발견했습니다. 새 DB를 생성하고 코드 우선 DB 마이그레이션을 위해 보류중인 변경 사항이있는 경우 "Update-Database"명령을 실행하려고했습니다. 해결 방법 : "Add-Migration -MigrationName"명령을 실행하여 새 DB에 대한 새 마이그레이션을 생성합니다. 그런 다음 "Update-Database"명령을 실행합니다.


0

Add-Migration을 실행할 때 최신 상태 인 데이터베이스에도이 문제가있었습니다. 단순히 Add-Migration 명령을 두 번 실행하면 해결됩니다. 위의 Robin Dorbell이 제안한대로 연결 문제를 의심합니다.


내 시나리오에서 데이터베이스 이름은 명령을 실행할 때 대소 문자를 구분했습니다. 연결
문자열

0

그것은 내가 갑자기 db에 이미 존재하는 이전 마이그레이션 클래스의 이름을 바꾸었을 때 발생했습니다. 나는 VCS 기록을 확인하고 그것을 결정하고 다시 이름을 바꿨습니다. 모두 나중에 작동했습니다.


0

나는 다른 방법을 썼다. 데이터베이스를 완전히 삭제하고 "update-database"를 다시 실행합니다.


이것은 실행 가능한 수정을 제공하지 않습니다. 유효한 마이그레이션은 기존 구조를 유지합니다.
Ferdipux

0

더 간단한 문제가있었습니다. VS는 워크 스테이션에 연결된 클라이언트 사이트에 VPN 연결이있을 때이 오류를 잘못보고했습니다. 문제는 DBMS 보안이 실제 로컬 IP의 요청 만 수락하도록 설정되었다는 것입니다. VPN을 끄는 것만으로 문제가 해결되었습니다.


0

제 경우에는 Azure의 방화벽 규칙에 IP 주소를 추가하는 것을 잊었습니다. 기본적으로 데이터베이스에 연결할 수 없어서이 오류가 발생했습니다. 특히 제 경우에는 Azure의 데이터베이스 방화벽 규칙에 IP 주소를 추가했는데 모두 잘 작동했습니다. 이 외에도 프록시 / 인터넷 연결 / DB 사용자 이름 암호 / DB 연결 문자열 등의 문제 일 수 있습니다. 또는 분명히 Update-Database 명령을 실행해야하는 보류중인 마이그레이션이있을 수 있습니다.


0

역사적으로 나는 항상 보류중인 마이그레이션을 삭제하거나 1 개만 남아 있고 대부분 바람직한 경우를 사용 -f하여 다시 생성 하여이 문제를 해결 했습니다.

최근에 이것은 나를 위해 작동하지 않습니다.

이 일이 처음 발생했을 때 Visual Studio를 다시 시작한 다음 계속 진행할 수있었습니다.

두 번째로 프로젝트에서 Clean을 실행 한 후에 만 ​​작동했습니다. 탐색기에서 모든 파일을 삭제해도 보류중인 마이그레이션이 그대로 유지되는 것과 거의 같습니다.


0

이것은 많은 사람들에게 답이 될 수 없지만 EF는 DB에 연결할 수 없을 때이 오류를 표시합니다. 저처럼 집에서 일하는 경우 VPN에 연결되어 있는지 확인하세요!


-1

마이그레이션에서 다른 마이그레이션으로 되 돌린 직후에 똑같은 문제가 발생했습니다.

제 경우에는 "migration06"에서 "migration04"로 "targetedmigration"합니다.

"migration0"6을 삭제해야했고 "migration05"를 강제로 만들 수있었습니다. 이는 기본적으로 대상 마이그레이션 이후에 다음 마이그레이션을 유지해야 함을 의미합니다.


-1

필자의 경우 (MS Visual Studio 사용) Visual Studio를 다시 시작하는 것만 큼 간단했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.