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

각 컨텍스트가 자체 데이터베이스에 해당하는 동일한 프로젝트의 여러 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.



답변

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

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

Update-Database -ConfigurationTypeName MyRenamedConfiguration


답변

@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
    

답변

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

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"

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


답변

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

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

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

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

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

Update-Database -ConfigurationTypeName MyNewContextConfiguration 

끝난.

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

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


답변

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

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

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

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


답변

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

Update-Database -context EnrollmentAppContext

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


답변

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.