2

CodeFirst가 데이터베이스에서 마이 그 레이션을 실행하지 못하게하려면 어떻게합니까?EF CodeFirst가 Unity에서 종속성 삽입을 구성 할 때 데이터베이스에서 마이그레이션을 실행하지 못하도록하려면 어떻게해야합니까?

나는 다음과 같은 오류 메시지가 발생 SqlException을 얻고있다 :

Invalid object name 'dbo.__MigrationHistory'. 

이러한 예외는 잡아서 내 로깅 프레임 워크에 의해 기록되고있다. 예외가 발생하는 것을 방지하여 내 응용 프로그램에서 가짜 로그 메시지가 많이 생성되지 않도록해야합니다.

나는 __MigrationHistory 테이블이 코드 첫 마이그레이션의 일부임을 이해합니다. I 코드 우선 사용하지만 은 마이그레이션을 사용하지 않습니다.

static InstitutionContext() 
{ 
    System.Data.Entity.Database.SetInitializer<InstitutionContext>(null); 
} 

(이, 물론, InstitutionContext라는 DbContext 객체.)

: (.이 프로젝트는 대신 FluentMigrator 사용) this blog postthis answer에 따르면, 오류를 사용하지 않도록, 나는 다음을 수행해야

나는이 작업을 수행하여 코드 줄이 맞았는지 확인했습니다. 그러나 로그에서 여전히 오류가 발생합니다.

는 무슨 일이 일어나고 있는지 설명하고 있으며 기본적으로 정확하다고 생각합니다. 간단히 말해서 EF는 __MigrationsHistory 테이블을 조사 중이며 찾지 못하면 예외를 throw 한 다음 마이그레이션을 수행하지 않고 계속 진행합니다. 그러나 그 대답은 예외가 발생하는 것을 어떻게 억제하는지 설명하지 않습니다.

EF 코드 첫 마이그레이션이 실행되어 해당 SqlException을 던지지 않도록하려면 어떻게해야합니까?

UPDATE 1

나는의 App.config/Web.config 파일을 통해 설정을 구성했는데, 그 중 하나가 작동하지 않았다. 있어야 할 것처럼

public class MyDbConfiguration : DbConfiguration 
{ 
    public MyDbConfiguration() 
    { 
     SetDatabaseInitializer<InstitutionContext>(null); 
    } 
} 

클래스는 DbContext와 같은 조립에 : 나는이 같은 자신의 구성 클래스에 내 DbContext에 정적 메서드에서 이동했습니다. 이것도 작동하지 않았다.

업데이트 2

문제는 유니티 컨테이너 관련이있는 것으로 밝혀졌다, 그리고 EF와 유니티는 내가 모두 구성한 방법 어떻게 주어진 상호 작용했다. 아래의 my answer을 참조하십시오.

+0

'disableDatabaseInitialization' 속성을 사용해 보셨습니까? https://msdn.microsoft.com/en-us/data/jj556606#Initializers – jmoerdyk

+0

나는 그것을 시도했지만 올바른 장소에 넣었는지 확실치 않습니다. 나는 이것을 웹 프로젝트의 Web.config에 넣었지만, Azure를 통해이 작업이로드되므로, 뭔가 변경되는지 확실하지 않습니다. 구성 파일 대신 코드를 통해이를 수행 할 수있는 방법이 있습니까? –

+0

프로젝트가 어떻게 구성되어 있는지에 따라 작동해야합니다. 대체 방법은 다음과 같습니다. https://romiller.com/2014/06/10/reducing-code-first-database-chatter/ –

답변

0

내 질문에 주석으로 메모, 내가 뭘하고 있었는지 작동합니다. 문제는 내 프로젝트가 유니티 의존성 주입 컨테이너를 사용하는 방법으로 밝혀졌습니다.

등록 된 모든 유형의 경우 가상 메소드 인터셉터도 구성하고있었습니다. 내가 가입이처럼 내 DbContext를 구성했다 :

Container.RegisterType<IInstitutionContext, InstitutionContext>(); 
Container.Configure<Interception>() 
    .SetInterceptorFor(typeof(InstitutionContext), 
     new VirtualMethodInterceptor()); 

이 문제는 VirtualMethodInterceptor이었다. 인터셉터가 InstitutionContext 클래스를 감싸는 중입니다.

Entity Framework 6은 DbContext 형식이 구성된 DbInitializer 형식의 레지스트리를 유지 관리합니다. 처음으로 새로운 유형의 DbContext을 볼 때 내부 레지스트리에서 DbInitializer이 호출되어야하는지 확인합니다. DbContext의 유형을 기반으로 DbInitializer을 찾습니다. 등록 된 DbInitializer을 찾지 못하면 CreateDatabaseIfNotExists 인 기본 이니셜 라이저를 사용합니다.

그러나 VirtualMethodInterceptor이 (내 경우, InstitutionContext에서) 주어진 DbContext 유형 구성되어있는 경우, 유니티 컨테이너는 직접 InstitutionContext를 인스턴스화하지 않습니다. 대신 가상 메서드를 가로 채기 위해 InstitutionContext을 래핑합니다. EF6은 형식을 찾아 DbInitializer을 찾으려고 할 때 랩 형식 인 DbContext 형식 인 이 아닌 형식 인 InstitutionContext을 확인합니다. 따라서 일치하는 유형을 찾지 못하며 기본 데이터베이스 초기화 프로그램을 사용합니다.

DbContext 유형의 인터셉터를 제거하면 문제가 해결됩니다.

tl; dr :DbContext이 다른 유형으로 포장되어 있지 않은지 확인하십시오. EF6의 DbInitializer 구성이 작동하려면 올바르게 DbContext 유형을 점검해야합니다. DbContext이 등록 된 DbInitializer 유형에서 상속 된 경우 작동하지 않으며 DbContext이 래퍼 유형 인 경우 작동하지 않습니다.