각 컨텍스트가 자체 데이터베이스에 해당하는 동일한 프로젝트의 여러 DB 컨텍스트에 대해 Entity Framework 5 (버전 5.0.0) 마이그레이션을 활성화하려면 어떻게해야합니까? Enable-Migrations
PM 콘솔 (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는 잘못된 컨텍스트에 마이그레이션을 적용하려고 시도합니다.
다음은 저에게 잘 맞는 특정 단계입니다.
마이그레이션이 엉망이고 새 “기준”을 생성하려는 경우 :
- Migrations 폴더에서 기존 .cs 파일 삭제
- SSMS에서 __MigrationHistory 시스템 테이블을 삭제합니다.
초기 마이그레이션 만들기 :
-
패키지 관리자 콘솔에서 :
Enable-Migrations -EnableAutomaticMigrations -ContextTypeName NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
-
솔루션 탐색기에서 : Migrations.Configuration.cs의 이름을 Migrations.ConfigurationA.cs로 바꿉니다. Visual Studio를 사용하는 경우 생성자의 이름을 자동으로 변경해야합니다. 확인하십시오. ConfigurationA.cs 편집 : 네임 스페이스를 NamespaceOfContext.Migrations.MigrationsA로 변경합니다.
-
Enable-Migrations -EnableAutomaticMigrations -ContextTypeName NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
-
솔루션 탐색기에서 Migrations.Configuration.cs의 이름을 Migrations.ConfigurationB.cs로 바꿉니다. 다시, 생성자의 이름도 적절하게 변경되었는지 확인하십시오. ConfigurationB.cs 편집 : 네임 스페이스를 NamespaceOfContext.Migrations.MigrationsB로 변경합니다.
-
add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
-
Update-Database -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
-
add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
-
Update-Database -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
패키지 관리자 콘솔에서 마이그레이션 스크립트를 만드는 단계 :
-
실행 명령
Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA
또는-
Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB
변경 사항이 DB에 적용될 때까지이 명령을 다시 실행해도됩니다.
-
원하는 로컬 데이터베이스에 대해 스크립트를 실행하거나 -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.cs
andConfigB.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
은 일부 명명 규칙을 위반하는 것 같아서 이제 ContextAContext
및 ContextBContext
. 이러한 이름을 사용하여 다음 명령을 사용할 수 있습니다. (내 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.
