코드 우선 마이그레이션을 비활성화하려면 어떻게해야합니까?


85

EF5에 코드 우선 엔터티 모델이 있습니다. 그러나 데이터베이스 변경 사항을 수동으로 관리하고 싶습니다. EF가 기존 데이터베이스와 모든 데이터를 수정하는 것을 원하지 않습니다. 그러나 EF 매핑과 데이터베이스에서 병렬 변경을 수행하면 EF가 제대로 작동하지 않고 코드 우선 마이그레이션을 사용해야한다고 알려줍니다. 이 기능을 어떻게 해제합니까?


답변:


100

Database.SetInitializer를 null로 설정합니다.

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }

2
컨텍스트의 인스턴스 생성자에 이니셜 라이저를 설정하는 것은 의미가 없습니다. EF는 새 컨텍스트를 만들려고하면 실제로 해당 코드에 도달하기 전에 이니셜 라이저를 호출합니다.
Jcl

1
VS 2017에서 "진단 도구"를보고 답을 확인했습니다. 생성자에서 초기자를 null로 설정 한 후 첫 번째 원하는 SQL 쿼리 이전의 ADO.NET 호출이 중지되었습니다.

2
예상대로 작동합니다. 사실 EF는 이전에 이니셜 라이저를 호출하지만 생성자 내에서 다시 호출하면 DbContext가 마이그레이션을 무시합니다 __MigrationHistory. 최신 마이그레이션이 없다는 사실을 무시하려는 경우 어쨌든 해. 제 경우에는 개발 환경에서 마이그레이션을 사용하지만 프로덕션에 배포 할 때는 SSDT를 사용하여 데이터베이스를 업데이트합니다. 따라서 EF는 __MigrationHistory최신 마이그레이션이 없기 때문에 모델이 변경되었다고 불평 하지만 데이터베이스가 업데이트되었음을 ​​보장 할 수 있습니다.
Alisson

호출을 Database.SetInitializer생성자에서 클래스 생성자로 이동하는 것이 좋습니다 . 이렇게하면 통화가 한 번만 이루어집니다.
Steven

40

그래서 내가 찾은 가장 완전한 대답은 다음과 같습니다.

  1. Migrations프로젝트 내의 폴더를 삭제 하십시오.
  2. Database.SetInitializer<DatabaseContext>(null);DatabaseContext 이니셜 라이저 내부에 설정 하십시오.
  3. __MigrationHistory데이터베이스 내의 테이블을 삭제하십시오 . EF6 +의 경우 테이블이 아래에 Tables있지만 이전 버전의 경우 System Tables.
  4. 빌드하고 실행하십시오.
  5. 이익.

안타깝게도 이러한 단계를 수행 한 후에도 EF6는 여전히 __MigrationHistory내 애플리케이션이 시작될 때마다 존재를 확인 하여 내 앱의 시작 시간에 몇 밀리 초를 더 추가합니다. __MigrationHistory수표를 완전히 비활성화하는 방법이 있습니까?
Dai

27

마이그레이션을 완전히 끄려면 다음을 수행하십시오.

https://stackoverflow.com/a/9709407/141172

그러나 코드 우선 마이그레이션을 활성화 한 상태로 유지하는 것이 더 낫다는 것을 알았지 만 -ScriptEF가 각 데이터베이스 (개발, QA, 프로덕션)에 수동으로 적용 할 수있는 DB 변경 스크립트를 생성 하도록하는 옵션을 사용했습니다 .

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

그런 식으로 EF가 나를 위해 변경 스크립트를 생성하고 적용되는 변경 사항을 여전히 완전히 제어 할 수 있습니다. 다른 소스 코드처럼 변경 스크립트를 버전 화합니다.


1
귀하의 링크가 실제로에 해당하지 않습니다 completely turn off migrations. 이를 위해 : 추가 Database.SetInitializer<YourContextType>(null)응용 프로그램의 시동을
돈 치들에게

EF Core로 이것을 달성하는 방법을 알고 있습니까?
Shimmy Weitzhandler

@Shimmy : EF Core는 데이터베이스 변경을 자동으로 시도해서는 안됩니다. github.com/dotnet/efcore/issues/3152
Eric J.

26

이미 마이그레이션을 사용한 경우 이니셜 라이저 만 변경해도 도움이되지 않습니다. Management Studio로 이동하여 데이터베이스 테이블을 열고 System Tables폴더 로 이동하여 __MigrationHistory거기에있는 테이블을 제거해야 합니다 (EF6 이상의 경우 바로 아래에 있음 Tables). 이렇게하면 마이그레이션이 영구적으로 비활성화됩니다.


7
__MigrationHistory 테이블은 시스템 테이블이 아닌 테이블 바로 아래에 있습니다.
Peter Hedberg 2014 년

6
@PeterHedberg 이것은 EF6 +에 해당됩니다. 이전 버전의 경우 System Tables.
Episodex

1
을 사용하여 테이블을 삭제하는 대신 이름을 바꿀 수도 있습니다 sp_rename. 이니셜 라이저도 비활성화했습니다.
NMrt 19

2

이 "문제"를 다음과 같이 해결했습니다.

  1. 데이터베이스에서 "_MigrationHistory"테이블을 삭제합니다.
  2. 프로젝트에서 "Migrations"폴더를 삭제합니다.
  3. EDMX 파일 업데이트 중.
  4. 프로젝트를 정리하고 다시 빌드하십시오.

내 환경의 구성은 다음과 같습니다.

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

EDMX 파일에서 무엇을 업데이트했는지 물어봐도 될까요? 또한 Database First를 사용하고 있으며 아직 존재하지 않는 마이그레이션 테이블을 쿼리하고 있습니다. 감사합니다!
dalcam

나중에 마이그레이션이 필요한 경우 _MigrationHistory자동으로 새 테이블을 생성 합니까?
sairfan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.