EF Core를 사용하여 ASP.NET Core에서 마이그레이션을 적용 취소하는 방법


180

PM> Remove-Migration -context BloggingContextEF Core를 사용하여 ASP.NET Core 프로젝트로 VS2015에서 실행할 때 다음 오류가 발생합니다.

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

어떻게 적용을 취소 할 수 있습니까? ASP.NET Core 1.0, EF Core 및 VS2015 Update 3의 최신 릴리스를 사용하고 있습니다.


3
-force마지막에 추가해보세요
잠재 고객

1
learnentityframeworkcore.com/migrations#reversing-a-migration 문서 에 단계가 설명되어 있습니다. 링크에 대한 @drewskis 감사 합니다
Michael Freidgeim

감사합니다 @MichaelFreidgeim
Drewskis

답변:


215

사용하다:

CLI

> dotnet ef database update <previous-migration-name>

패키지 관리자 콘솔

PM> Update-Database <previous-migration-name>

예:

PM> Update-Database MyInitialMigration

그런 다음 마지막 마이그레이션을 제거하십시오.

데이터베이스에 변경 사항을 적용했기 때문에 데이터베이스 업데이트없이 마이그레이션을 제거 할 수 없습니다.

PMC를 사용하는 경우 시도 : PM> update-database 0 데이터베이스를 지우고 솔루션에서 마이그레이션 스냅 샷을 제거 할 수 있습니다.


6
여전히 같은 오류가 발생합니다. 나는 dotnet ef database update MyFirstMigration --context BloggingContext그것이 성공적으로 작동 하는 것을 처음 사용 했습니다. 그럼 난 도망 dotnet ef migrations remove --context BloggingContext내 게시물에서 같은 날 같은 오류 메시지가 준

14
이전에 마이그레이션으로 업데이트해야합니다 MyFirstMigration. 이름에서 알 수 있듯이 첫 번째 마이그레이션 인 dotnet ef database update 0경우 데이터베이스에서 모든 마이그레이션을 되돌릴 수 있습니다 . 그런 다음 실행할 수 있어야합니다 dotnet ef migrations remove.
bvpb

또한 날짜 접두사를 제외하고 마이그레이션 이름 만 사용해야합니다.
Structed

2
dotnet ef migrations remove이 후 전화
Chamika Sandamal

두 번째 진술 :이 답변에서 "마지막 마이그레이션 제거 시도"가 완료되지 않았습니다. 정확히 무엇을 의미하는지 말하십시오. 마이그레이션 파일을 제거 하시겠습니까? 명령을 실행? ...
S.Serpooshan

125

모든 마이그레이션을 완전히 제거하고 다시 시작하려면 다음을 수행하십시오.

dotnet ef database update 0
dotnet ef migrations remove

1
그러나 모든 마이그레이션을 제거하고 싶지는 않습니다. 예를 들어 Data \ Migrations 폴더 아래에 ID (사용자 계정)에 대해 생성되는 기본 마이그레이션을 유지하려고합니다.

알아 두는 것이 좋지만 나중에 dotnet ef database update 0실행 dotnet ef migrations remove하면 Identity의 기본 마이그레이션이 제거되므로 바람직하지 않습니다.
kimbaudi

팁 주셔서 감사합니다 dotnet ef database update 0! 나는 이것을 어디에도 언급하지 않았다 ...
Tobias J

3
@nam "그러나 모든 마이그레이션을 제거하고 싶지는 않습니다." 그러나 우리 중 일부는 그렇게합니다. 내가 원하는 것을 가정하지 마십시오 :)
starmandeluxe

3
이것은 나를 위해 작동하지 않았습니다. 첫 번째 줄은 괜찮 았고 모든 마이그레이션을 제거했습니다. 두 번째 줄에서The migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
Ido Ran

52

여전히 Update-Database명령을 사용할 수 있습니다 .

Update-Database -Migration <migration name> -Context <context name>

그러나 마이그레이션 이름으로 판단하면 명령이 작동하지 않을 수있는 첫 번째 마이그레이션이라고 가정합니다. __MigrationHistory데이터베이스 의 테이블에서 항목을 삭제 한 후 Remove-Migration명령을 다시 실행할 수 있어야 합니다. 마이그레이션 파일을 삭제하고 다시 시작할 수도 있습니다.


Update-Database패키지 관리 콘솔 dotnet ef database update에서 호출하거나 프로젝트 디렉토리의 명령 프롬프트에서 호출 할 수 있습니다 .
kimbaudi

6
그냥 여기 브래드의 답변을 명확하게 - <migration name>당신이 할 마이그레이션의 이름이어야 으로 돌아갑니다 (즉, 아마도 마이그레이션 하기 전에 당신이 망쳐 것) 실행 취소 할 마이그레이션이 아닌 이름입니다.
Mark Amery

52

특정 마이그레이션을 적용하지 않으려면 다음을 수행하십시오.

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

모든 마이그레이션을 적용 취소하려면 :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

마지막 마이그레이션을 제거하려면

dotnet ef migrations remove
or
PM> Remove-Migration

모든 마이그레이션을 제거하려면

Migrations폴더를 제거하십시오 .

마지막 몇 가지 마이그레이션을 모두 제거하려면 (모두는 아님) :

이 마이그레이션의 무리를 제거하는 명령은 없으며 우리는 단지이 몇 제거 할 수 없습니다 migrations자신의 *.designer.cs우리가 일관성있는 상태에서 스냅 샷 파일을 계속해야하기 때문에 파일을. 마이그레이션을 하나씩 제거해야합니다 ( To remove last migration위 참조 ).

마지막 마이그레이션을 적용하고 제거하려면

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

나는 unapply이 포스트들 에서 온 단어를 계속보고있다 . 그것은 단지 기술적 인 용어가 아니라는 말입니다. 그것은 단어입니다un - apply
Helzgate

28

마지막으로 적용된 마이그레이션을 되돌리려면 다음을 수행해야합니다 (패키지 관리자 콘솔 명령).

  1. 데이터베이스에서 마이그레이션을 되 돌리십시오. PM> Update-Database <prior-migration-name>
  2. 프로젝트에서 마이그레이션 파일을 제거하십시오 (또는 다음 단계에서 다시 적용됨).
  3. 모델 스냅 샷 업데이트 : PM> Remove-Migration

UPD : 최신 버전의 Visual Studio (2017)에는 두 번째 단계가 필요하지 않은 것 같습니다.


1
감사합니다! 이것은 모든 솔루션 중에서 2 단계의 필요성을 언급 한 사람이 없다는 사실에 완전히 매료되었습니다.
Michael Kargl

Yeh, 아무도 2 단계를 언급하지
않았습니다.

두 번째 단계에 대해 확실하지 않습니다. 제 경우 (최신 VS2017) 마이그레이션 파일이 Remove-Migration문제없이 호출 된 후 자동으로 삭제됩니다 . "다음 단계에서 다시 적용됩니다"라고 말한 내용이 확실하지 않습니다.
S.Serpooshan

@ S.Serpooshan 실제로. 수동으로 삭제했지만 Remove-Migration을 실행할 때 이전 마이그레이션이 데이터베이스에 적용되었다는 불만이 제기되었습니다. 그러나 작동합니다.
MetalMikester

내가 생각하는 두 번째 단계는 dbContext.Database.Migrate()startup.cs에서 전화하는 경우에만 필요합니다
user3413723

23

가치별로 마이그레이션을 타겟팅 할 수 있습니다.

 Update-Database -Migration:0

그런 다음 제거하십시오

 Remove-Migration

1
이것은 나를 위해 일한하지만 난 VS2017와 EF 및 .NET 코어 2.0을 사용하고 있습니다
제임스 모리슨을

2
주의 : -Migration : 0은 마이그레이션없이 상태로 돌아가는 것을 의미합니다. 이렇게하면 데이터베이스가 깨끗해집니다.
Kieren Johnstone

질문에 따라 예. 롤백하려는 마이그레이션에 따라 값을 증가시킬 수 있습니다.
John Nyingi

11

데이터베이스에 이미 적용된 후 가장 최근의 마이그레이션을 "적용하지 않으려면":

  1. SQL Server 개체 탐색기를 엽니 다 (보기-> "SQL Server 개체 탐색기").
  2. 작은 삼각형을 옆으로 확장하여 프로젝트에 연결된 데이터베이스로 이동하십시오.
  3. "테이블"펼치기
  4. "dbo._EFMigrationsHistory"라는 테이블을 찾으십시오.
  5. 마우스 오른쪽 단추로 클릭하고 "데이터보기"를 선택하여 Visual Studio에서 테이블 항목을보십시오.
  6. 적용을 취소하려는 마이그레이션에 해당하는 행을 삭제하십시오 (프롬프트가 표시되면 "예"라고 경고하십시오).
  7. project.json 파일이있는 디렉토리의 명령 창에서 "dotnet ef migrations remove"를 다시 실행하십시오. 또는 패키지 관리자 콘솔에서 "마이그레이션 제거"명령을 실행하십시오.

이것이 도움이되고 프로젝트의 모든 마이그레이션에 적용되기를 바랍니다 ... 나는 가장 최근의 마이그레이션으로 만 테스트했습니다 ...

행복한 코딩!


21
이것은 실제로 마이그레이션을 적용 취소하지 않고 프레임 워크를 적용하지 않은 "생각"하게합니다. 이 작업을 수행하면 데이터베이스가 일관성이없는 상태가됩니다.
mark.monteiro

__EFMigrationsHistory에서 데이터를 수동으로 편집하는 것은 끔찍한 조언입니다. 하지마 이 테이블은 마이그레이션 도구에 의해서만 사용됩니다. 데이터를 수동으로 편집하기 시작하면 한 번의 실수로 인해 프로젝트에서 예기치 않은 모든 종류의 예기치 않은 동작이 발생할 수 있습니다. 다른 권장 솔루션 중 하나를 사용하는 것이 훨씬 좋습니다.
Joe Irby

우리는 하급 팀원이 지점 교환과 혼동하여 두 가지에서 수동으로 마이그레이션을 삭제하는 상황이 발생했습니다 (이미 적용된 이후 __EFMigrationsHistory 테이블에 있었음에도 불구하고). 이것이 우리가해야 할 일이자 SSMS의 일부 수동 반전입니다. 이 시점에서 다른 선택이없는 한하지 마십시오. 적어도 그가 한 것은 새로운 단일 필드를 추가하는 것입니다.
Ella


10

'_EFMigrationsHistory' 테이블 에서 마이그레이션 '20160703192724_MyFirstMigration' 레코드를 삭제해야 합니다.

그렇지 않으면 이 명령은 마이그레이션을 제거하고 마이그레이션 폴더를 삭제합니다.

   > remove-migration -force

7

일반적으로 패키지 관리자 콘솔을 사용하는 경우 특정 마이그레이션을 제거하는 올바른 방법은 마이그레이션 이름을 참조하는 것입니다.

Update-Database -Migration {Name of Migration} -Context {context}

문서 에 따라 마지막으로 적용한 마이그레이션을 제거하는 다른 방법 은 다음 명령을 사용하는 것입니다.

dotnet ef migrations remove

이 명령은 솔루션 디렉토리 의 개발자 명령 프롬프트 (명령 프롬프트 를 여는 방법) 에서 실행해야합니다 .

예를 들어 응용 프로그램 이름이 "Application"이고 c : \ Projects 폴더에있는 경우입니다. 그런 다음 경로는 다음과 같아야합니다.

C:\Projects\Application

1
`dotnet ef migrations remove '가 "마이그레이션이 이미 데이터베이스에 적용되었습니다"오류를 반환하면
어떻게해야하는지

2

EF Core 1.0에서 마이그레이션을 적용 취소하려면 다음 명령을 사용하십시오.

dotnet ef 데이터베이스 업데이트 {migration_name}

변경 사항을 보존 할 때까지 마이그레이션의 마이그레이션 이름을 사용하십시오. 마이그레이션 이름 목록은 다음을 사용하여 찾을 수 있습니다.

닷넷 ef 마이그레이션 목록


2

DB에 적용된 모든 마이그레이션을 되돌리려면 다음을 실행하십시오.

update-database 0

Remove-Migration마이그레이션 디렉토리에 마이그레이션 파일이 표시되는 횟수만큼 실행해야합니다 . 이 명령은 최신 마이그레이션을 삭제하고 스냅 샷도 업데이트합니다.


1

처음에는 다음 명령을 실행하십시오.

PM>update-database -migration:0

그리고 이것을 실행하십시오 :

PM>remove_migration


0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();

-1

1. "dbo._EFMigrationsHistory"테이블을 찾은 다음 제거 할 마이그레이션 레코드를 삭제하십시오. 2. PM (Package Manager Console)에서 "remove-migration"을 실행하십시오. 나를 위해 작동합니다.


이것은 (예를 들어 열이 이미 삭제) 데이터베이스의 일관성이없는 상태로 이어질 것
UNeverNo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.