EF 마이그레이션 : 마지막으로 적용된 마이그레이션을 롤백 하시겠습니까?


435

이것은 일반적인 작업처럼 보이지만 쉬운 방법을 찾을 수 없습니다.

마지막으로 적용된 마이그레이션을 취소하고 싶습니다. 나는 다음과 같은 간단한 명령을 기대했을 것이다.

PM> Update-Database -TargetMigration:"-1"

대신, 내가 생각해 낼 수있는 것은 :

PM> Get-Migrations

Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

(적어도 타임 스탬프를 건너 뛰고 이름 만 사용할 수 있습니다 ...)

더 쉬운 방법이 있습니까?


1
슬프게도, 여기 우리는 몇 년이 지나서 실제로 아무도 그 질문을 읽지 않습니다.
다니엘 ZA

답변:


160

EF 5.0부터는 사용자가 설명하는 방식이 선호되는 방식입니다. 그래서

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

또는 예제 마이그레이션 사용

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

한 가지 해결책은 위의 단계를 자동화하는 랩퍼 PS 스크립트를 작성하는 것입니다. 또한이 기능에 대한 기능 요청을 작성하거나 더 나은 기능을 구현할 수 있습니다. https://github.com/dotnet/ef6


4
또 다른 세부 사항 : 기존 수동 마이그레이션이있는 경우 롤백해야하지만 "Down"메서드가 실제로 롤백하지 않는 것을 인식하고 편집하고 저장 한 다음 update-database -target을 다시 실행할 수 있습니다. 제대로 롤백 될 때까지. 사실을 적용한 후 수동 마이그레이션을 수정해도 편집 할 수없는 것으로 변경되지 않습니다.
Chris Moschini

1
이것은 나를 위해 작동하지 않습니다. "지정된 대상 마이그레이션"-1 "은 존재하지 않습니다.
tutiplain

2
@tutiplain 그의 두 번째 코드 블록을보십시오. 존재하는 것이 아니라 그가 원하는 것을 인용하는 것입니다.
Sinjai 2016 년

dotnet 명령을 사용하여 올바른 방법은 무엇입니까? 문서에서 찾을 수 없거나 내용이 누락되었습니다. entityframeworktutorial.net/efcore/… 제안을 통해 시도 ?
Sijan Shrestha

dotnet ef database update LastGoodMigration그러나 해결책을 찾았 지만 노드 배경에서오고 knex를 사용하여 혼란스러워 보입니다 .sequlize, 마지막 변경 사항을 취소하는 명령이 있으며 데이터베이스에 적용된 마지막 작업을 되 돌리는 명령이 있습니까? ?
Sijan Shrestha

415

이 스레드에 설명을 추가하고 싶습니다.

Update-Database -TargetMigration:"name_of_migration"

위의 작업은 지정된 마이그레이션이 남아있을 때까지 모든 마이그레이션을 롤백하려는 것입니다. 따라서 GET-MIGRATIONS를 사용하고 A, B, C, D 및 E가있는 경우이 명령을 사용하면 E 및 D를 롤백하여 C로 이동합니다.

Update-Database -TargetMigration:"C"

또한 누군가가 반대 의견을 말할 수 없다면 서수 값과 짧은 -Target 스위치를 사용할 수 있음을 알았습니다 (따라서 -Target은 -TargetMigration과 같습니다). 모든 마이그레이션을 롤백하고 다시 시작하려면 다음을 사용할 수 있습니다.

Update-Database -Target:0

위의 0은 첫 번째 마이그레이션조차 롤백합니다 ( 이 명령은 파괴적인 명령입니다-사용하기 전에 수행중인 작업을 알고 있어야합니다! )-위의 구문을 사용하면 대상 마이그레이션 (마이그레이션이 적용되기 전에 0 번째 마이그레이션 이름이 존재하지 않습니다!). 따라서이 경우 0 (기본) 값을 사용해야합니다. 마찬가지로 마이그레이션 A, B, C, D 및 E (순서대로)를 적용한 경우 서수 1은 A를, 서수 2는 B를 참조해야합니다. 따라서 B로 롤백하려면 다음 중 하나를 사용할 수 있습니다.

Update-Database -TargetMigration:"B"

또는

Update-Database -TargetMigration:2

2019 년 10 월 수정 :

비슷한 질문에 대한 이 관련 답변 에 따르면 올바른 명령은 -TargetEF Core 1.1에 대한 것이고 -MigrationEF Core 2.0에 대한 명령입니다 .


27
인덱스가 0 인 마이그레이션의 이름은입니다 $InitialDatabase.
MEMark

1
감사. $ LatestDatabase와 같은 다른 인덱스 위치 또는 이와 유사한 것을 나타내는 $ (name) 값이 있습니까?
Jazimov

모르겠어요 간단한 인터넷 검색으로 찾을 수 없었습니다. 어쩌면 EF 소스 코드를 탐색하면 공개 될 수 있습니까?
MEMark

3
참고로, 우리는 방금 이것에 부딪 쳤고 OP와 동일한 일을 ls variable:*하려고했습니다 ... 사용 하는 $InitialDatabase것은 단순히 0으로 정의 된 PowerShell 변수이며 현재 EF 소스 코드에도 정의 된 다른 변수는 없습니다. 그리고 get-migrations는 아무것도 반환하지 않고 콘솔에만 기록하므로 반환 된 객체를 반복 할 수 없습니다.
DrewJordan

1
이것이 답이되어야합니다
WtFudgE

76

에서 EntityFrameworkCore :

Update-Database 20161012160749_AddedOrderToCourse

여기서 20161012160749_AddedOrderToCourse롤백하려는 마이그레이션 이름입니다.


3
보석! 이 답변을 찾는 데 시간이 걸렸습니다 (.NET Core 용으로 변경됨). 공감할만한 가치가 있습니다!
HockeyJ

4
날짜 / 시간을 포함하지 않아도됩니다. 당신은 이름을 넣을 수 있습니다.
Richard Marskell-Drackir

1
이것은 나를 위해 작동하지 않습니다 ... 그것은 "완료"라고 말할 것이지만 내가 지정한 하나 이후의 모든 이주는 여전히 남아 있습니다. 이러한 마이그레이션에서 "다운"코드는 실행되지 않았습니다.
egmfrs

Update-Database -Migration : "AddedOrderToCourse"특히 마이그레이션 이름에 공백을 사용할 때이를 수행하는 방법입니다. (즉, 업데이트-데이터베이스 -Migration "코스 추가 주문")
SwissCoder

13

해결책은 다음과 같습니다.

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
이것은 이미 질문에서 언급되었지만, asker는 이미 이것을 알고 있습니다. 이것이 어떻게 도움이되는지 모르겠습니다. 어쩌면 더 명확하게 만들 수 있습니까?
ANeves

이 답변은 더 간결합니다. TY 맥스!
andreikashin

4

추가 알림 :

구성 유형이 여러 개인 경우 [ConfigurationName]을 지정해야합니다.

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]

3

EF Core에서는 Remove-Migration잘못된 마이그레이션을 추가 한 후 패키지 관리자 콘솔에서 명령 을 입력 할 수 있습니다 .

마이그레이션에 데이터가 손실 될 수있는 경우 콘솔에서 제안합니다.

작업이 발판되어 데이터가 손실 될 수 있습니다. 마이그레이션이 정확한지 검토하십시오. 이 작업을 실행 취소하려면 마이그레이션 제거를 사용하십시오.


3
update-database 0

경고 :EFCore에서 모든 마이그레이션을 롤백합니다! 주의해서 사용하십시오 :)


2

패키지 관리자 콘솔에서 실행할 때 이것이 작동한다는 것을 알았습니다.

dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }

보다 쉬운 스크립트를 만들 수 있습니다.


1

내가 사용하고 EntityFrameworkCore을 나는 @MaciejLisCK으로 대답을 사용합니다. 여러 DB 컨텍스트가있는 경우 컨텍스트 매개 변수를 추가하여 컨텍스트를 지정해야합니다. 예 :

Update-Database 201207211340509_MyMigration -context myDBcontext

( 201207211340509_MyMigration롤백하려는 마이그레이션은 어디에 있으며 myDBcontextDB 컨텍스트의 이름입니다)



0

기본적으로 AutomaticMigrationDataLossAllowed = false이므로 dataloss가 발생할 가능성이있는 경우 EF가 update-database 명령을 완료하지 않고 -force 매개 변수로 실행하지 않으면 조치를 롤백합니다 .

Update-Database TargetMigration:"Your migration name" -force

또는

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