EF 6 및 Code First 마이그레이션의 동일한 DB 및 애플리케이션에있는 여러 DB 컨텍스트


94

Entity Framework를 처음 사용합니다. EF 6을 사용하는 MVC 응용 프로그램을 설정하려고합니다. Code First 마이그레이션을 사용하고 있습니다. 앱에서 영역을 사용하고 있으며 각 영역에서 다른 DbContext를 사용하여 분리하고 싶습니다. EF 6에 ContextKey가 있다는 것을 알고 있지만 사용 방법에 대한 완전한 정보를 찾을 수 없습니다. 현재는 한 번에 하나의 컨텍스트 만 마이그레이션을 사용할 수 있습니다.

누군가 저와 같은 EF에 새로운 사람이 이해하고 사용할 수 있도록 충분한 세부 사항과 함께 예제를 줄 수 있습니까?

답변:


176

Entity Framework 6 DbContext-ContextTypeName-MigrationsDirectory플래그 를 추가하여 다중에 대한 지원을 추가했습니다 . 패키지 관리자 콘솔에서 명령을 실행하고 아래 출력을 붙여 넣었습니다.

DbContext프로젝트에 2가 있고를 실행 enable-migrations하면 오류가 발생합니다 (아마도 이미 알고있을 것입니다).

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

따라서 enable-migrations각각 DbContext개별적 으로 실행해야합니다 . 그리고 Configuration.cs생성 할 각 파일 에 대해 폴더를 지정해야합니다 .

PM> Enable-Migrations -ContextTypeName ApplicationDbContext -MigrationsDirectory Migrations\ApplicationDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

PM> Enable-Migrations -ContextTypeName AnotherDbContext -MigrationsDirectory Migrations\AnotherDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

DbContext에 대한 마이그레이션을 추가하려면 Configuration클래스의 정규화 된 이름을 지정하여 다음과 같이 수행합니다 .

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

그리고 update-database같은 방식으로 실행 합니다.

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113124_InitialDatabaseCreation].
Applying explicit migration: 201402032113124_InitialDatabaseCreation.
Running Seed method.

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113383_InitialDatabaseCreation].
Applying explicit migration: 201402032113383_InitialDatabaseCreation.
Running Seed method.

도움이 되었기를 바랍니다.


각 컨텍스트에 대해 별도의 연결 문자열이 있어야합니까? 아니면 그에 대한 방법이 있습니까?
Lrayh

3
동일한 연결 문자열을 공유 할 수 있습니다. 그러나 동일한 테이블에 매핑되지 않도록해야합니다.
Anthony Chu

동일한 테이블에 매핑하는 경우에도 먼저 실행할 마이그레이션을 정의하고 마이그레이션 파일을 그대로두고 테이블을 생성하고 두 번째로 실행하며 이미 기존 테이블을 생성하지 않도록 수정할 수 있습니다. 그런 다음 각 컨텍스트의 MigrateDatabaseToLatestVersionforzing 을 사용 ctx.Database.initialize()하여 올바른 순서로 실행하거나 올바른 순서로 Update-Database명령을 직접 실행할 수 있습니다. (그리고 반대로 이전 버전으로 db 마이그레이션을 수행하는 경우). 그것은` "위험" 하지만 수행 할 수 있습니다.
JotaBe 2014

그래서 내 프로젝트에 마이그레이션을 추가하고 ApplicationDbContext와 다른 컨텍스트를 만들었습니다. 나는 약 6 개월 동안 사이트 관련 데이터 인 컨텍스트를 계속 사용했고, 내 ApplicationUser를 엉망으로 만들기 시작할 때가되었습니다. 내 기본 로그인 및 등록이 작동했지만 사용자 클래스를 확장하여 추가 필드를 추가하고 싶었습니다. 이 답변은 해당 컨텍스트에 대한 새 마이그레이션 구성을 설정하는 데 매우 유용했습니다. 감사합니다! # 1up
Eric Bishard 2015

1
이 짧지 만 충분한 대답에 대해 +10을 줄 수 있다면 @AnthonyChu에게 감사드립니다.
Karim AG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.