여러 컨텍스트에 대한 EF 마이그레이션을 사용하여 데이터베이스를 분리하려면 어떻게해야합니까?


122

각 컨텍스트가 자체 데이터베이스에 해당하는 동일한 프로젝트의 여러 DB 컨텍스트에 대해 Entity Framework 5 (버전 5.0.0) 마이그레이션을 활성화하려면 어떻게해야합니까? Enable-MigrationsPM 콘솔 (Visual Studio 2012)에서 실행할 때 여러 컨텍스트가 있기 때문에 오류가 발생합니다.

PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.

나는 실행하면 Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext내가 실행할 수 아니에요 Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext마이그레이션이 이미 존재하기 때문에 :Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.


답변:


126

Configuration.cs 파일이 이미 있기 때문에 Enable-Migrations에 대한 두 번째 호출이 실패합니다. 해당 클래스와 파일의 이름을 바꾸면 두 번째 Enable-Migrations를 실행할 수 있어야합니다. 그러면 다른 Configuration.cs가 생성됩니다.

그런 다음 데이터베이스를 업데이트 할 때 사용할 구성을 지정해야합니다.

Update-Database -ConfigurationTypeName MyRenamedConfiguration

1
"MyRenamedConfiguration"이란 무엇입니까?
Robert Noack

1
"MyRenamedConfiguration"은 예제로 자리 표시 자 텍스트입니다. 원래 Configuration.cs의 이름을 다른 것으로 바꿀 수 있습니다 (예 : FooBar, 그런 다음 Update-Database -ConfigurationTypeName FooBar 실행).
ckal 2014-06-16

3
단축 형식 : Update-Database -conf MyRenamedConfiguration
Peter Kerr

100

@ckal이 제안한 것 외에도 이름이 변경된 각 Configuration.cs에 고유 한 네임 스페이스를 제공 하는 것이 중요 합니다. 그렇지 않으면 EF는 잘못된 컨텍스트에 마이그레이션을 적용하려고 시도합니다.

다음은 저에게 잘 맞는 특정 단계입니다.

마이그레이션이 엉망이고 새 "기준"을 생성하려는 경우 :

  1. Migrations 폴더에서 기존 .cs 파일 삭제
  2. SSMS에서 __MigrationHistory 시스템 테이블을 삭제합니다.

초기 마이그레이션 만들기 :

  1. 패키지 관리자 콘솔에서 :

    Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextA
    
  2. 솔루션 탐색기에서 : Migrations.Configuration.cs의 이름을 Migrations.ConfigurationA.cs로 바꿉니다. Visual Studio를 사용하는 경우 생성자의 이름을 자동으로 변경해야합니다. 확인하십시오. ConfigurationA.cs 편집 : 네임 스페이스를 NamespaceOfContext.Migrations.MigrationsA로 변경합니다.

  3. Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB
    
  4. 솔루션 탐색기에서 Migrations.Configuration.cs의 이름을 Migrations.ConfigurationB.cs로 바꿉니다. 다시, 생성자의 이름도 적절하게 변경되었는지 확인하십시오. ConfigurationB.cs 편집 : 네임 스페이스를 NamespaceOfContext.Migrations.MigrationsB로 변경합니다.

  5. add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB 
    
  6. Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    
  7. add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName
    NameOfMainProject  -ConnectionStringName ContextA 
    
  8. Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

패키지 관리자 콘솔에서 마이그레이션 스크립트를 만드는 단계 :

  1. 실행 명령

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

    또는-

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    

    변경 사항이 DB에 적용될 때까지이 명령을 다시 실행해도됩니다.

  2. 원하는 로컬 데이터베이스에 대해 스크립트를 실행하거나 -Script없이 Update-Database를 실행하여 로컬로 적용합니다.

    Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

    또는-

    Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    

# 4 변화 : 편집 ConfigurationA.cs -> 편집 ConfigurationB.cs
브라이언 Rizo

1
@Biran : 알아 주셔서 감사합니다. 나는 대답을 편집했습니다. 답변을 직접 수정할 수도 있습니다. 아직 평판이 2000 개가 아니기 때문에 검토 대기열에 대한 답변은 일반적으로 신속하게 처리되므로 편집은 몇 분 내에 승인되었을 것입니다.
Eric J.

5
감사합니다! 그것이 내가 놓친 것입니다 (네임 스페이스).
William M. Rawls

처음에는 2 단계와 4 단계 에서 이름을 바꾸는 방법이 명확하지 않았기 때문에 도움이 될 수 있습니다 . Configuration.cs 파일의 이름을 ConfigurationA.cs 또는 ConfigurationB.cs로 바꾸면 이름을 바꾸면 클래스와 생성자는 ConfigurationA 또는 ConfigurationB로 이름이 변경됩니다. 클래스 이름을 바꾸지 못하면 add-migration 명령을 실행할 때 오류 메시지가 발생합니다.- "마이그레이션 구성 유형 'ConfigurationA'는 어셈블리 '...'에서 찾을 수 없습니다. ' -예, 다음과 같은 문구가 잘못되었습니다. 내가 VS2013에서받은 오류 메시지-LOL
Greg Barth

3
이것은 나를 도왔다! 모든 옵션 및 주문과 함께 완전한 지침. 나에게 시간 저장
elcool을

81

방금 같은 문제에 부딪 혔고 다음 솔루션을 사용했습니다 (모두 패키지 관리자 콘솔에서)

PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextA" -ContextTypeName MyProject.Models.ContextA
PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextB" -ContextTypeName MyProject.Models.ContextB

마이그레이션 폴더에 2 개의 별도 폴더가 생성됩니다. 각각은 생성 된 Configuration.cs파일 을 포함 합니다. 불행히도 여전히 해당 Configuration.cs파일의 이름을 변경해야 합니다. 그렇지 않으면 두 파일이 있다는 불만이 있습니다. 내 파일 이름을 ConfigA.csandConfigB.cs

편집 : (제공 : 케빈 McPheat)을 Configuration.cs 파일 이름을 바꿀 때 또한 클래스 이름과 생성자의 이름을 변경, 기억 / EDIT를

이 구조로 간단하게 할 수 있습니다

PM> Add-Migration -ConfigurationTypeName ConfigA
PM> Add-Migration -ConfigurationTypeName ConfigB

그러면 구성 파일 옆의 폴더 내에 마이그레이션을위한 코드 파일이 생성됩니다 (이러한 파일을 함께 보관하는 것이 좋습니다).

PM> Update-Database -ConfigurationTypeName ConfigA
PM> Update-Database -ConfigurationTypeName ConfigB

마지막으로이 두 명령은 해당 데이터베이스에 올바른 마이그레이션을 적용합니다.

2016 년 2 월 8 일 편집 : EF7 버전 7.0.0-rc1-16348로 약간의 테스트를 수행했습니다.

-o | --outputDir 옵션을 사용할 수 없습니다. 계속해서Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument

그러나 마이그레이션이 처음 추가되면 마이그레이션이 Migrations 폴더에 추가되고 다른 컨텍스트에 대한 후속 마이그레이션이 마이그레이션의 하위 항목에 자동으로 추가되는 것처럼 보입니다.

원래 이름 ContextA은 일부 명명 규칙을 위반하는 것 같아서 이제 ContextAContextContextBContext. 이러한 이름을 사용하여 다음 명령을 사용할 수 있습니다. (내 dnx는 여전히 패키지 관리자 콘솔에서 작동하며 마이그레이션을 수행하기 위해 별도의 CMD 창을 열고 싶지 않습니다.)

PM> dnx ef migrations add Initial -c "ContextAContext"
PM> dnx ef migrations add Initial -c "ContextBContext"

그러면 Migrations폴더에 모델 스냅 샷과 초기 마이그레이션이 생성 됩니다 ContextAContext. ContextB이 파일을 포함하는 이름의 폴더가 생성 됩니다.ContextBContext

수동으로 ContextA폴더를 추가 하고 마이그레이션 파일 ContextAContext을 해당 폴더로 옮겼습니다 . 그런 다음 해당 파일 (스냅 샷 파일, 초기 마이그레이션 및 초기 마이그레이션 파일 ... designer.cs 아래에 세 번째 파일이 있음) 내의 네임 스페이스 이름을 변경했습니다. .ContextA네임 스페이스 에 추가 해야했고 프레임 워크가 자동으로 다시 처리합니다.

다음 명령을 사용하면 각 컨텍스트에 대한 새 마이그레이션이 생성됩니다.

PM>  dnx ef migrations add Update1 -c "ContextAContext"
PM>  dnx ef migrations add Update1 -c "ContextBContext"

생성 된 파일은 올바른 폴더에 저장됩니다.


5
최고의 솔루션, 간단하고 명확한 폴더를 유지합니다.
Malick

2
이것이 내가 필요한 대답이었습니다. -MigrationsDirectory를 통해 추가 된 네임 스페이스가 답이었습니다! 감사합니다.
Crob

1
좋고 깨끗한 솔루션. 감사.
Stefan Cebulak 2016

4
1,5 년 후, 내 게시물을 사용하여 새 프로젝트를 설정할 수있게되어 기쁩니다.
bart s

1
실행 add-migration하면 Name. 이것은 내가 이미 제공 ConfigurationTypeName하고 있었기 때문에 나를 약간 쫓아 냈고 그것이 방금 말했을 때 약간 짜증이났다 Name:. 그러나 물론 그것이 원하는 이름은 변경에 대한 '사람이 읽을 수있는'설명입니다. AddedProducts또는 IncreaseLengthOfNameFields. Migrations 폴더에서 클래스 이름의 일부로 얻을 수 있으므로 무엇이 무엇인지 쉽게 알 수 있습니다. 따라서 실제로 Name는 체크인 댓글과 같습니다.
Simon_Weaver

7

마이그레이션이 많은 "구성"이 이미 있고이를 그대로 유지하려는 경우 항상 새 "구성"클래스를 만들고 다음과 같이 다른 이름을 지정할 수 있습니다.

class MyNewContextConfiguration : DbMigrationsConfiguration<MyNewDbContext>
{
   ...
}

그런 다음 명령을 실행하십시오.

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

EF는 문제없이 마이그레이션을 비계 할 것입니다. 마지막으로 데이터베이스를 업데이트하십시오. 지금부터 업데이트 할 구성을 알려주지 않으면 EF가 불평 할 것입니다.

Update-Database -ConfigurationTypeName MyNewContextConfiguration 

끝난.

Enable-Migrations를 처리 할 필요가 없습니다. "Configuration"이 이미 존재한다고 불평하고 기존 Configuration 클래스의 이름을 바꾸면 마이그레이션 기록에 문제가 발생합니다.

다른 데이터베이스 또는 동일한 데이터베이스를 대상으로 할 수 있으며 모든 구성은 __MigrationHistory 테이블을 멋지게 공유합니다.


4

더 많은 데이터베이스가 있으면 PowerShell에서 다음 코드를 사용하십시오.

Add-Migration Starter -context EnrollmentAppContext 
  • 'Starter'는 마이그레이션 이름입니다.

  • 'EnrollmentAppContext'는 내 앱 컨텍스트의 이름입니다.

다음을 수행하여 VS에서 PowerShell을 열 수 있습니다. Tools->NuGet Package Manager->Package Manager Console


1
이것은 나를 도왔다. 감사! :)
noobprogrammer

3

PowerShell에서 데이터베이스 유형 다음 코드를 업데이트하려면 ...

Update-Database -context EnrollmentAppContext

* 하나 이상의 데이터베이스가 존재하는 경우이 코드 만 사용하십시오. 그렇지 않으면 필요하지 않습니다.


0

EF 4.7은 실제로 여러 컨텍스트에서 Enable-migrations를 실행할 때 힌트를 제공합니다.

'Service.Domain'어셈블리에 둘 이상의 컨텍스트 유형이 있습니다.

To enable migrations for 'Service.Domain.DatabaseContext.Context1', 
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context1.
To enable migrations for 'Service.Domain.DatabaseContext.Context2',
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context2.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.