기존 EF Code First 데이터베이스를 처음부터 삭제하고 다시 만드는 방법


84

VS 2012에서 EF 5와 함께 EF Code First를 사용하고 있습니다. PM update-database명령을 사용 하고 일부 테이블을 샘플 데이터로 채우는 간단한 시드 방법이 있습니다.

x.mdb를 삭제하고 다시 만들고 싶습니다. 업데이트 기록이 동기화되지 않은 것 같습니다. 내 컨텍스트에서 모든 DBSet을 주석 처리하면 update-database오류없이 실행되지만 DB에 일부 테이블이 남습니다. DB에 귀중한 데이터가 없기 때문에 모든 것을 재설정하는 것이 가장 간단한 것 같습니다.

어떻게 할 수 있습니까?

답변:


110

내가 제대로 이해하고 있다면 ...

원하는 경우 start clean:

1) 수동으로 DB를 삭제하십시오 -어디에 있든 (연결이 정렬되어 있다고 가정합니다) 비워 두지 만 더 쉽고 안전 system __MigrationHistory합니다-테이블 이 있으므로 모두 제거해야합니다-제거해야합니다.

2) 아래에있는 모두 제거migration filesMigrations 있고 숫자와 같은 이름 모두 제거합니다.

3) 마이그레이션 (및 나머지)이 포함 된 프로젝트다시 빌드 하고 프로젝트가 자동으로 빌드되도록 설정 (구성)되어 있는지 확인합니다 (때로는 문제를 일으킬 수 있지만 사용자에게는 문제가되지 않음).

4) Add-Migration Initial다시 실행 하십시오.Update-Database


6
그래서 데이터베이스 자체를 삭제하기 위해 ef 마이그레이션을 얻는 명령이 없습니까?
cjb110

1
... 내가 아는 한 (최신 버전이 확실하지 않음)-EF / 마이그레이션은 Db가 없을 때 '생성'한 다음 코드를 변경하면 '업데이트'하는 데 능숙합니다. 하지만 관리 유지 보수를해야 할 때는 손을 더럽혀 야합니다
NSGaga-mostly-inactive

1
또한 SQL 서버 개체 탐색기에서 데이터베이스를 제거해야했습니다.
Steven Jeuris

Update-Database를 실행하기 전에 Visual Studio를 다시 시작해야 작동합니다. 첫 번째 시도에서 추가 마이그레이션이보고 된 문제없이 진행되었지만 새 구조를 생성하는 동안 오류가 발생했습니다.
Patric

2
@lpacheco 삭제하고 싶지 않은 데이터가 포함 된 프로덕션 데이터베이스가있는 경우 "기존 ... 데이터베이스를 삭제하는 방법" 이라는 질문이 올바른 질문이 아니라고 정중하게 제안합니다. .
Mark Amery

60

명령 Add-Migration "Name_Of_Migration"을 사용하여 마이그레이션을 만드는 올바른 방법을 작업 한 경우 다음을 수행하여 깔끔하게 시작할 수 있습니다 ( 물론 데이터 손실과 함께 재설정 ).

  1. Update-database -TargetMigration:0

    다운 메소드가 실행되었으므로 일반적으로 DB는 비어 있습니다.

  2. Update-database

    그러면 현재 마이그레이션에 대한 DB가 다시 생성됩니다.


1
Update-database -TargetMigration : 0은 모든 것을 삭제하기 위해 -f (force) 플래그가 필요합니다. 그렇지 않으면 데이터 손실 가능성이 있습니다. 명령은 다음과 같아야합니다 업데이트 - 데이터베이스 -TargetMigration : 0 -f
Tascalator

@Tascalator, -f없이 이것을 시도했고 가능한 데이터 손실에 대한 경고가 없었습니다. EF 6.1.2를 사용하고 삭제 된 테이블에 데이터가 있습니다.
jk7 2015 년

완벽한 대답입니다. 빠르고 쉽습니다! Thnx
sapatelbaps

EF Core Docs에 따르면 올바른 매개 변수 이름은 -Target (EF Core 1.1의 경우) 또는 -Migration (EF Core 2.0의 경우)
Harvey Darvey입니다.

32

패키지 관리자 콘솔에서 드롭, 생성 및 시드하는 단일 라이너 :

update-database -TargetMigration:0 | update-database -force

카붐.


5
동일한 단계를 두 번 실행해야하는 이유는 무엇입니까? "갱신 데이터베이스 -force는"내 말은
SwissCoder

작은 알림 : "AutomaticMigrationDataLossAllowed = true;" 구성 내에서 필요합니다.
Unicco

2
EF Core의 동등한 구문은 Update-Database 0. 그럼에도 불구하고 이것은 "업데이트 내역이 동기화되지 않은 것처럼 보이는" OP의 경우에는 적합하지 않습니다 . 이 접근 방식은 지금까지 데이터베이스에 적용된 모든 마이그레이션에 대해 "다운"마이그레이션을 실행하는 방식으로 작동하므로 이전에 적용된 마이그레이션을 삭제 한 경우 실패합니다 ( 이후 마이그레이션을 수정 한 경우에도 마찬가지로 실패 할 수 있음). 적용). 허용 대답은 더 강력하다. -1, 그리고 설명되지 않은 반복 update-database -force.
Mark Amery

1
@SwissCoder-동일한 단계가 두 번 필요하지 않습니다 (적어도 나는 그렇지 않았습니다). 오타라고 생각합니다.
Ed Graham

1
@SwissCoder 솔직히 내가 발견하지 않았습니다, 어떤 범죄 의도가 없으며
Vima91

31

EntityFrameworkCore의 경우 다음을 사용할 수 있습니다.

Update-Database -Migration 0

이렇게하면 데이터베이스에서 모든 마이그레이션이 제거됩니다. 그런 다음 다음을 사용할 수 있습니다.

Remove-Migration

마이그레이션을 제거하려면. 마지막으로 마이그레이션을 다시 만들어 데이터베이스에 적용 할 수 있습니다.

Add-Migration Initialize
Update-Database

EFCore v2.1.0에서 테스트 됨


2
매력처럼 작동합니다!
pavelnieks 2010

4

어때 ..

static void Main(string[] args)
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExampleContext>());  
    // C
    // o
    // d
    // i
    // n
    // g
}

나는 이것을 Programming Entity Framework : Code First , Pg 28 First Edition에서 선택했습니다.


11
이것은 좋은 ida가 아닙니다. 기회는이 코드는 생산에 도달 할 수 있으며, 당신은 당신의 고객과 매우 두통 오게 ...
아마데오 갈라

이것은 모델이 변경된 경우에만 데이터베이스를 삭제하고 OP는 모델 변경 없이도 삭제를 원합니다.
Quantic


0

다음 단계를 수행하십시오.

  1. 컨텍스트에서 삭제해야하는 객체를 삭제합니다. // Dbset<Item> Items{get;set;} Nuget 콘솔에서 다음 명령을 실행합니다.
  2. 추가 마이그레이션 [contextName]
  3. update-database -verbose

컨텍스트에 존재하지 않지만 이미 데이터베이스에 생성 된 테이블을 삭제합니다.


0

dbctx.Database.EnsureDeleted (); dbctx.Database.EnsureCreated ();


0

새로운 사용자가 유용하다고 생각하므로 여기에서 답변을 업데이트하는 데 도움을 드리겠습니다. 목표는 데이터베이스 자체를 삭제하고 EF Code First 접근 방식을 사용하여 다시 만드는 것입니다. 1. ".sln"확장자를 사용하여 Visual Studio에서 프로젝트를 엽니 다. 2. Server Explorer를 선택합니다 (종종 왼쪽에 있음). 3. SQL Server Object Explorer를 선택합니다. 4. 삭제하려는 데이터베이스가 localDB 아래에 나열됩니다. 그것을 마우스 오른쪽 버튼으로 클릭하고 삭제를 선택하십시오.


OP가 명시 적으로 언급했기 때문에 OP가 명령 줄에서 실행되는 명령을 찾고 있었던 것 같습니다 update-database. 따라서 귀하의 UI 솔루션은 그들이 찾고있는 것이 아닐 것입니다.
valkn0t

0

데이터베이스를 삭제하거나 기존 데이터베이스를 업데이트하는 방법에는 여러 가지가 있습니다. 간단히 이전 마이그레이션으로 전환 할 수 있습니다.

dotnet ef database update previousMigraionName    

그러나 일부 데이터베이스에는 관계 생성 후 수정을 허용하지 않는 것과 같은 제한이 있습니다. 즉, ef core 데이터베이스 공급자에서 열을 삭제할 수있는 권한이 없지만 ef core drop database에서 대부분의 시간이 허용되므로 drop 명령을 사용하여 DB를 삭제할 수 있습니다. 이전 마이그레이션을 다시 사용합니다.

dotnet ef database drop
PMC command 
PM> drop-database

또는 수동으로 데이터베이스를 삭제하고 마이그레이션을 수행 할 수 있습니다.


-2

이 질문은 새로운 EF Core 사용자가 언젠가 클릭 할 것이며 상위 답변이 다소 불필요하게 파괴적이라는 것을 알게되므로 "새로"시작하는 방법을 보여 드리겠습니다. 이것은 모든 데이터를 삭제합니다.

  1. MS SQL 서버의 모든 테이블을 삭제하십시오. __EFMigrations 테이블도 삭제하십시오.
  2. 유형 dotnet ef database update
  3. EF Core는 이제 0부터 최신 마이그레이션까지 데이터베이스를 다시 만듭니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.