엔터티 프레임 워크 마이그레이션 재설정


299

마이그레이션 IgnoreChanges을 시작했고 초기 마이그레이션에 사용했지만 이제는 모든 마이그레이션을 삭제하고 모든 논리를 사용하여 초기 마이그레이션을 시작하려고합니다.

폴더에서 마이그레이션을 삭제하고 시도 Add-Migration하여 전체 파일을 생성하지 않으면 (비어 있습니다. 마지막으로 변경되지 않았지만 지금은 마이그레이션되었으므로 삭제되었습니다).

어떤 거기에 안-마이그레이션 내가 다시 실행할 수 있도록 명령은 Enable-Migrations?



3
연결 문자열이 여러 개인 경우 중요한 참고 사항 : 마이그레이션을 재설정 할 때 사용할 문자열을 지정하십시오. 그렇지 않으면 불일치가있을 때 문제를 일으킬 수있는 두 가지 모두에 적용하려고합니다.
Jeroen Vannevel

참고 : 마이그레이션을 삭제하지 않은 경우 (버전 제어 권한을 사용합니까?) 먼저 db를 업데이트하여 마이그레이션을 삭제 한 다음 완화 지점을 삭제하고이 시점에서 새 마이그레이션을 만들 수 있습니다. 여기를 참조하십시오 : stackoverflow.com/a/23793384/309634
DarcyThomas에게

답변:


446

당신은해야합니다 :

  1. 상태 삭제 : 프로젝트에서 마이그레이션 폴더를 삭제하십시오. 과
  2. __MigrationHistory데이터베이스 에서 테이블을 삭제하십시오 (시스템 테이블 아래에있을 수 있음). 그때
  3. 패키지 관리자 콘솔에서 다음 명령을 실행하십시오.

    Enable-Migrations -EnableAutomaticMigrations -Force

    유무에 관계없이 사용 -EnableAutomaticMigrations

  4. 마지막으로 다음을 실행할 수 있습니다.

    Add-Migration Initial

5
^^ 알아 냈습니다. TFS 오류입니다. TFS를 사용하는 경우 "Enable-Migrations ..."명령을 실행하기 전에 체크인을 수행해야합니다. : D
BrainSlugs83 8

7
버전 관리를 사용하지 않는 경우 삭제하기 전에 Seed 값을 저장하십시오!
RyanJMcGowan

77
@RyanJMcGowan 버전 관리를 사용하지 않으면 작업을 잃을 자격이 있습니다. :-)
Mike Cole

4
@Tood. +1합니다. 많은 시간을 절약했습니다. 이제 EF 팀만이이 모든 것을 Reset-Migrations 명령에 통합 할 수 있다면. 아마 EF 6 ...
Gerald Davis

24
기존 데이터베이스의 경우 "위로"기능의 내용을 주석 처리해야합니다. 그렇지 않으면 "Update-Database"를 실행할 때 오류가 발생합니다. 테이블이 이미 존재한다고 불평합니다
Guy

149

문제 : 마이그레이션을 중단 시켰으며 기존 테이블을 삭제하지 않고 재설정하려고합니다.

문제점 : EF가 처음부터 테이블을 작성하려고하므로 데이터베이스의 기존 테이블로 마이그레이션을 재설정 할 수 없습니다.

해야 할 일 :

  1. Migrations_History 테이블에서 기존 마이그레이션을 삭제하십시오.

  2. 마이그레이션 폴더에서 기존 마이그레이션을 삭제하십시오.

  3. 추가 마이그레이션 재설정을 실행하십시오. 그러면 마이그레이션 폴더에 테이블 생성이 포함 된 마이그레이션이 생성되지만 실행되지 않으므로 오류가 발생하지 않습니다.

  4. 이제 EF가 현재 상태의 스냅 샷을 갖도록 MigrationHistory 테이블에서 초기 행을 작성해야합니다. 마이그레이션을 적용하면 EF가이를 수행합니다. 그러나 테이블이 데이터베이스에 이미 존재하므로 방금 수행 한 마이그레이션을 적용 할 수 없습니다. 따라서 마이그레이션으로 이동하여 "Up"메소드 내부의 모든 코드를 주석 처리하십시오.

  5. 이제 update-database를 실행하십시오. 마이그레이션을 적용하고 (실제로 데이터베이스를 변경하지는 않음) MigrationHistory에서 스냅 샷 행을 만듭니다.

이제 마이그레이션을 재설정했으며 일반 마이그레이션을 계속할 수 있습니다.


11
이것은 나를 위해 일한 유일한 대답입니다. 허용 된 답변은 Update-Database를 실행하거나 응용 프로그램을 실행할 때 발생하는 문제 (사용중인 초기화 프로그램에 따라 다름)를 해결하지 못하는 것 같습니다. 마이그레이션을 실행하고 이미 존재하는 변경을 시도합니다. 내가 빠진 것이 아니라면.
regularmike

2
또한 더 유연한 해답입니다. 제 경우에는 적용해야 할 일부 변경 사항이 있었고 다른 일부는 적용되지 않았습니다. Up ()에 유용한 내용을 유지할 수 있습니다.
tec-goblin

1
@ H.Johnson, 나는 그것을 보았다. 그것에 대해 질문이 있습니까?
Greg Gum

2
EF 6.0부터 _MigrationsHistory 테이블에는 여러 DBContext에 대한 마이그레이션이 포함되어 있습니다. 삭제하면 문제가 발생할 수 있으므로 ContextKey = 마이그레이션 이름 인 행만 삭제해야합니다. 또한 위의 2 이후에 나는 다시 이주를 가능하게해야했다
David Waterworth

2
기본적으로 같은 대답, 확장 된 예제 (스크린 샷 포함) : weblog.west-wind.com/posts/2016/Jan/13/…
nmit026

30

어때요?

Update-Database TargetMigration: $InitialDatabase

패키지 관리자 콘솔에서 모든 업데이트를 초기 상태로 재설정해야합니다.

참조 링크 : 코드 우선 마이그레이션-특정 버전으로 마이그레이션 (다운 그레이드 포함)


내 주된 좌절은 더 이상 국가를 정확하게 유지하기 위해 이주를 신뢰하지 않았다고 생각합니다. 결과적으로 처음부터 시작하고 싶습니다.
Todd

@Todd, 나는 뒤죽박죽이었고 마이그레이션 파일을 모두 삭제 해야하는지 항상 명확하지는 않았습니다. 이제 다음과 같이 작동합니다. 1. "Update-Database –TargetMigration : $ InitialDatabase"명령을 사용하여 초기로 되돌립니다. 2. 이름이 yyyyMMddHHmmssx_Name.cs 또는 .vb로 명명 된 모든 마이그레이션 파일을 제거합니다. 3. 'add-Migration -Name some_name'을 사용하여 업데이트를 새로 고칩니다. 4. 'update-Database'를 사용하여 데이터베이스에 영향을주는 업데이트를 발행하십시오. 그것이 당신을 위해 작동하기를 바랍니다.
Chris Voon

필자의 경우이 대답의 제안 된 명령으로 인해 SQL 오류가 발생했습니다.
Justin Skiles

"InitialDatabase"는 무엇을 의미합니까? DB에서 이미 생성 된 테이블 또는 열을 삭제합니까?
서지

16

이 문제를 해결하려면 다음을 수행해야합니다.

  1. 마이그레이션 폴더에서 모든 * .cs 파일을 삭제하십시오.

  2. 데이터베이스에서 _MigrationHistory 테이블을 삭제하십시오.

  3. 운영 Enable-Migrations -EnableAutomaticMigrations -Force

  4. 운영 Add-Migration Reset

그런 다음 public partial class Reset : DbMigration클래스에서 기존 테이블과 현재 테이블을 모두 주석 처리해야합니다.

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

이 비트를 놓치면 모든 것이 실패하고 다시 시작해야합니다!

  1. 지금 실행 Update-Database -verbose

위의 작업을 올바르게 수행하면 정상적으로 완료되며 이제 정상적으로 수행 할 수 있습니다.


2
모든 것을 주석 처리하는 대신 "반환"이라고 쓸 수도 있습니다. Up () 메소드의 첫 번째 라인에서.
chainstair

6

우리가 .NET Core에서 EF를 검색 할 때 이것이 여전히 나타난다는 것을 고려할 때, 여기에 답을 게시 할 것입니다 (많은 유령이 있기 때문에). EF 6 .NET 버전에는 미묘한 부분이 있습니다 (초기 명령이 없으므로 "스냅 샷"파일을 삭제해야합니다)

(.NET Core 2.1에서 테스트)

단계는 다음과 같습니다.

  1. _efmigrationhistory테이블을 삭제하십시오 .
  2. 이름에 Snapshot 이 포함 된 파일 (예 :)을 찾기 위해 전체 솔루션을 검색 ApplicationDbContextSnapshot.cs하고 삭제하십시오 .
  3. 솔루션 재 구축
  4. 운영 Add-Migration InitialMigration

참고 : 모든 스냅 샷 파일을 삭제해야합니다 . 데이터베이스를 삭제하는 데 많은 시간이 걸렸습니다 ... 이렇게하지 않으면 빈 마이그레이션이 생성됩니다.

또한 # 3에서는 원하는대로 마이그레이션 이름을 지정할 수 있습니다.

추가 리소스는 다음과 같습니다. asp.net CORE 마이그레이션 생성 빈

Entity Framework 7 마이그레이션 재설정


3

EntityFramework 6에서 다음을 시도하십시오.

Add-Migration Initial

초기 마이그레이션 파일을 업데이트합니다.


3

Entity Framework Core에서

  1. 마이그레이션 폴더에서 모든 파일을 제거하십시오.
  2. 콘솔에 입력

dotnet ef 데이터베이스 삭제 -f -v

dotnet ef 마이그레이션으로 초기 추가

닷넷 ef 데이터베이스 업데이트


2

내 문제는 마이그레이션 폴더를 수동으로 제거했다는 것이 밝혀졌습니다. 내용을 백업하고 싶었 기 때문에 폴더를 프로젝트 밖으로 드래그했습니다. 나중에 (백업 복사본을 만든 후) 다시 가져 와서 솔루션 탐색기에서 마이그레이션 폴더를 마우스 오른쪽 단추로 클릭하고 팝업 메뉴에서 삭제를 선택하여 마이그레이션 폴더를 제거하여 문제를 해결했습니다.


1

EF6에서

  1. 'migrations'폴더의 모든 파일을 삭제하십시오 ... 'initial create'또는 'config'는 아닙니다.
  2. 데이터베이스를 삭제하십시오.
  3. 이제 실행하십시오 Add-Migration Initial.
  4. 이제 '데이터베이스 업데이트'를 할 수 있으며 모든 것이 잘됩니다.

1

Migrations폴더를 삭제Clean다음 Rebuild프로젝트 를 삭제 하십시오 . 이것은 나를 위해 일했습니다. 정리 및 다시 빌드하기 전에 캐시 된 메모리에 마이그레이션이 이미 존재하지만 아직 삭제되지 않았 음을 나타냅니다.


0

이 방법을 사용하면 __MigrationHistory테이블을 삭제할 필요가 없으므로 배포시 데이터베이스에 손을 대지 않아도됩니다.

  1. 마이그레이션 폴더에서 기존 마이그레이션을 삭제하십시오.
  2. 패키지 관리자 콘솔에서 Add-Migration ResetMigrations
  3. 다음 Up()방법으로 마이그레이션 기록을 정리하십시오 .
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}

0

Net Core 3.0에서 :

마이그레이션재설정 하는 방법을 찾지 못했습니다 .

또한 마이그레이션이 손상되어 문제가 발생했으며 여기에 제공된 답변이 효과가 없었습니다. .Net Core 3.0 웹 API가 있으며 지난 달 어딘가에 데이터베이스를 직접 편집했습니다. 예, 나는 나쁜 일을했습니다.

여기에 제안 된 전략으로 인해 패키지 관리자 콘솔에서 여러 오류가 발생했습니다.

  • 해당 이름의 마이그레이션이 이미 존재합니다
  • 스냅 샷을 찾을 수 없습니다
  • 'Force'는 인식되는 매개 변수가 아닙니다

물론, 나는 단계를 놓치거나 올바른 파일을 지우는 것을 놓쳤을 수도 있지만, 무차별적인 힘없이 이것을 정리하는 방법이 있다는 것을 알았습니다.

  • 고장난 마이그레이션까지 포함하여 이름순으로 각 마이그레이션마다 이름별로 PMC에서 마이그레이션을 제거합니다.
  • 현재 스키마까지의 마지막 정상 마이그레이션 사이의 델타가 될 새 마이그레이션을 작성하기위한 추가 마이그레이션

이제 빈 API로 웹 API를 시작하면 엔티티 모델과 일치하는 모든 테이블과 특성이 올바르게 작성됩니다.

HTH!



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