2012-08-22 3 views
26

Entity 프레임 워크 마이그레이션을 작동 시키려고합니다. 코드 첫 번째 마이 그 레이션, 마이 그 레이션 폴더, 구성 파일 및 마이 그 레이션 테이블을 만들었지 만 초기 생성은 사용하지 않았습니다. 단계가 빠졌습니까? 이것은 EF (4.3.1)가 만든 새로운 db입니다.Entity Framework 마이그레이션을 사용한 초기 생성이 없음

+2

후 마이그레이션을 사용, 당신은이 초기에 추가 자동으로 마이그레이션을 만들지 않습니다 – Dabblernl

+0

마이그레이션을 추가하는 방법? –

+2

이 http : // stackoverflow 도움이 될 수 있습니다.co.kr/questions/11679385/reset-entity-framework-migrations – detay

답변

21

이 동작은 기본적으로 적절하지 않지만 다양한 형식으로 쉽게 사용할 수 있습니다.

  1. 응용 프로그램 시작시 context.Database.CreateIfNotExists();으로 전화 할 수 있습니다.

  2. 내장 된 DatabaseInitializer 중 하나를 사용할 수 있습니다. CreateDatabaseIfNotExists 이니셜 라이저는 EntityFramework에 내장되어 있으며 프로젝트에 추가하기 만하면됩니다.

  3. 자체 내부에 옵션 # 1을 포함하는 사용자 지정 데이터베이스 초기화 프로그램을 만들 수 있습니다. 예 : Code First Migrations and initialization

코드 또는 구성 파일을 통해 DatabaseInitializer를 프로젝트에 포함 할 수 있습니다.

System.Data.Entity.Database.SetInitializer<DairyMmmContext>(new System.Data.Entity.CreateDatabaseIfNotExists<DairyMmmContext>()); 

참고 : entityframework의 일생이 코드가 변경 여러 번 당신이 설정 때문에 같은 DatabaseInitializer 할 수있는 응용 프로그램 시작에서

:

코드를 통해 EntityFramework 데이터베이스 초기화를 포함 ! 이 예는 현재 누젠을 통해 생산되는 EF 4.3 버전입니다.

<configuration> 
    <entityFramework> 
    <contexts> 
     <context type="MyNamespace.MyEFDataContext, AssemblyName"> 
     <databaseInitializer 
      type="System.Data.Entity.CreateDatabaseIfNotExists`2[[MyNamespace.MyEFDataContext, AssemblyName], 
       [MyNamespace.Migrations.Configuration, AssemblyName]], EntityFramework" /> 
     </context> 
    </contexts> 
    </entityFramework> 
</configuration> 

이 구성에 약간의 "비정상적"이 될 수있는이를 알 수 있습니다 :

구성 요소를 통해 EntityFramework 데이터베이스 이니셜 라이저를 포함합니다. AssemblyName을 엔티티 프레임 워크를 유지하는 어셈블리 이름으로 바꿔야하고 MyNamespace.MyEFDataContext을 엔티티 프레임 데이터 컨텍스트의 정규화 된 이름으로 바꾸고 MyNamespace.Migrations.Configuration을 구성 클래스의 정규화 된 이름으로 바꿉니다 (기본적으로 마이그레이션에서 프로젝트 내 폴더).

편집 : 추가 의견

마이그레이션에 대응하는 편집은 다른 스키마 정의에 하나의 스키마 정의에서 변화이다. 빈 데이터베이스를 만드는 것은 마이그레이션이 아닙니다. 빈 데이터베이스를 생성하기위한 프로젝트에는 마이그레이션 소스 파일이 없으며 이니셜 라이저에 의해 코드에서 완료됩니다.

DropCreateDatabaseAlways 초기화 도구를 이미 사용하고 있다면이 작업을 수행해야합니다. 그러나, 나는 당신이 타이밍 문제에 대한 기회가 있음을 의미하는 코드에서 이니셜 라이저를 설정하는 것으로 나타났습니다. 컨텍스트가 이미 이니셜 라이저를 호출 한 시점을 지나간 후에 이니셜 라이저를 설정하십시오.

context.Database.Initialize(true); (코드의 현재 상태에 관계없이 초기화를 강제하는 매개 변수는 true/false) 코드의 모든 지점에서 초기화 프로세스를 실행하도록 entityframework를 강제 설정할 수 있습니다. 그럴 때마다 데이터베이스가 삭제되고 재생성됩니다.

하지만 응용 프로그램의 수명주기에서 컨텍스트의 단일 인스턴스를 만들기 전에 이니셜 라이저가 가능한 한 빨리 설정되어 있는지 확인할 수도 있습니다.

+0

감사합니다. 나는 db가 생성 될 때 트리거하도록 이미 이것을 가지고있다 : Database.SetInitializer (new DropCreateDatabaseAlways ()); EF에서 초기 작성 마이그레이션 파일을 작성하는 데 충분하지 않습니까? –

+0

또한 초기 초기 생성은 자동 마이그레이션이며, 마이그레이션 스크립트가없는 이유인지, 초기 데이터베이스로 되돌리려면 자동 마이그레이션 인 초기 생성을 제외한 모든 마이그레이션을 되돌립니다. 모든 아이디어? db를 만든 후에 만 ​​마이 그 레이션을 활성화합니다. –

+0

@ newbie_86 내 대답을 수정하여 귀하의 의견을 언급했습니다. 같은 문제가있는 다른 사람들도이 정보로부터 이익을 얻을 수 있다고 생각합니다. – BenSwayne

4

같은 것이 확실하지 않지만 비슷한 문제가 있습니다. 내 문제는 내 연결 문자열을 얻기 위해 구성 파일에서 연결 문자열을 사용하지 않는다는 사실과 관련이 있다고 생각합니다.

솔루션의 시작 프로젝트와 패키지 관리자 콘솔의 projet 콤보를 사용하여 처음 마이그레이션을 생성 할 수있었습니다.

또한 패키지 관리자가 찾을 수 있도록 연결 문자열에 dbContext 클래스 이름을 지정하십시오.

9

여기의 기사/자습서 here (on microsoft.com) 은 initialCreate 마이그레이션이 존재하지 않는 이유를 설명합니다. 데이터베이스가 이미있는 경우에만 이주가 추가됩니다. 그렇지 않으면 아직 존재하지 않는 데이터베이스로의 마이그레이션을 생성 할 필요가 없으므로 첫 번째 마이그레이션은 'initialCreate'가됩니다 ... DB가 없으면 아래로 이전시 롤백 할 대상이 없습니다. 여기

은 관련 문단 :

:

실행이 명령은 우리의 프로젝트에 마이그레이션 폴더를 추가했습니다 패키지 관리자 콘솔에서 사용-마이그레이션 명령이 새 폴더는 두 개의 파일이 포함되어 있습니다 Configuration 클래스.이 클래스를 사용하면 컨텍스트에 맞게 마이그레이션 동작을 구성 할 수 있습니다. 이 연습에서는 기본 구성을 사용합니다. 프로젝트에 코드 우선 컨텍스트가 하나만 있으므로 Enable-Migrations는이 구성이 적용되는 컨텍스트 유형을 자동으로 채 웁니다.

InitialCreate 마이그레이션. 이 마이그레이션은 코드 첫 번째가 마이그레이션을 활성화하기 전에 데이터베이스를 생성했기 때문에 생성되었습니다. 이 스캐 폴딩 된 마이그레이션의 코드는 데이터베이스에 이미 생성 된 객체를 나타냅니다. 여기서는 BlogId 및 Name 열이있는 Blog 테이블입니다. 파일 이름에는 주문에 도움이되는 타임 스탬프가 포함되어 있습니다.

데이터베이스가 아직 생성되지 않은 경우이 InitialCreate 마이그레이션이 프로젝트에 추가되지 않았습니다. 대신 처음으로 Add-Migration을 호출하면 이러한 테이블을 만드는 코드가 새로운 마이그레이션으로 스캐 폴딩됩니다.

0

나는 EF 6 RC1을 사용하고 사용-마이그레이션을 실행할 때 InitialCreate도 __MigrationHistory도 생성되고 있었다이 문제로 실행하고 있습니다.

실제로 EF 5에서 EF 6으로 업그레이드 한 직후에 Enable-Migrations를 실행했는데 어떤 이유로 EF 5 스키마를 사용하여 __MigrationHistory 테이블을 만들었 기 때문에이 테이블과 My Migrations 디렉토리를 삭제하고 다시 시작하려고했습니다.

하지만 Migrations 디렉토리를 삭제할 때마다 InitialCreate 또는 __MigrationHistory가 생성되지 않습니다. 나는 데이터베이스를 삭제하고 다시 만들고 Visual Studio 2012를 다시 시작하지 않으려 고 노력했습니다. 나는 그날을 포기하고 다음날 아침에 다시 시도했다. 컴퓨터를 약 8 시간 동안 앉아 두었다가 InitialCreate를 만들었다.나는 정말로 긴 시간 제한을 가진 어딘가에 캐시가 있어야한다고 생각합니다 - 누구입니까? 또한 재부팅으로 인해 캐시가 지워질 수 있다고 추측하고 있지만 시도하지는 않았습니다.

어떤 경우이든 수동으로 해당 단계를 수행하려면 PM> Add-Migration InitialCreate을 사용할 수 있습니다.

어쨌든, 나는 여전히 __MigrationHistory 테이블을 얻지 못했습니다. 분명히, EF 6은 Enable-Migrations 명령 중에 EF 6을 생성하는 대신 Update-Database 명령 중에 만 생성하도록 변경했습니다. 나는 또한 내가를 업데이트 한 보장하기 위해 데이터베이스의 상태를 확인하는 첫 번째 명령 후 중지

PM> Update-Database -TargetMigration:0 
PM> Update-Database 

: 내 스키마가 이미 그 시점에서 생성했기 때문에, 나는 아래로 찢어 수동으로 다시 작성하는 데 필요한 according to this부터 데이터베이스 연결 문자열을 선택하거나 구성에 따라 자동 생성되며 올바르게 구성되어 있지 않으면 의도 한 SQL Server의 데이터베이스 나 인스턴스에 액세스 할 수 있다고 보장 할 수 없습니다.

두 명령을 모두 실행 한 후 __MigrationHistory 테이블을 만들었으며 시스템 테이블로 만들지 않았습니다. (실제로는 어쨌든 그렇게하지 않았습니다) 모든 것이 좋습니다. OP와 정확히 같은 문제는 아니지만 희망적으로 다른 사람에게 도움이 될 것입니다.

참고 문헌 :

16

"생성 초기"자동으로 생성되지 않습니다! 자신을 만들어야합니다. EF의 일부 자습서는 혼란스럽고 나는 당신과 같은 오해가있었습니다. 이미 데이터베이스 테이블 다음 도메인 모델을 만든 경우

-Add-Migration InitialModel 

: 당신이해야 할 일은

-Add-Migration InitialModel -IgnoreChanges 

이 시점부터를, 당신의 코드는 데이터베이스와 동기화 될 것이다 . 코드를 변경할 때마다 Add-Migration을 사용하여 데이터베이스에 변경 내용을 추가 할 수 있습니다.

+0

이 문제가 해결되었습니다. –

+0

기존 데이터베이스가있는 사용자에게 가장 쉬운 솔루션입니다. – JRadness

0

나는 이것이 오래되었음을 알고 있지만, 받아 들일 수있는 대답은없고 같은 문제가있다.

트릭은 Enable-Migrations 명령입니다. here에서 설명한대로 Enable-Migrations -EnableAutomaticMigrations입니다. 그것이하는 일은 당신이있는 곳에서 정확하게 마이그레이션을 시작합니다.

첫 번째 마이그레이션을 데이터베이스로 만들려면 Enable-Migrations (--EnableAutomaticMigrations를 사용하지 않음)을 실행하기 만하면됩니다.

그리고 초기화를 설정하는 기억

  Database.SetInitializer(new MigrateDatabaseToLatestVersion<LicenseContext, Configuration>()); 
관련 문제