2012-08-29 3 views
9

Linqpad에서 dbcontext 어셈블리에 대해 쿼리를 실행하려고하면 다음 오류가 발생합니다.Linqpad 및 EF5 코드 우선

InvalidOperationException : 'UserQuery'컨텍스트를 지원하는 모델이 데이터베이스가 생성 된 이후 변경되었습니다. 코드 첫 번째 마이그레이션을 사용하여 데이터베이스를 업데이트하는 것이 좋습니다 (http://go.microsoft.com/fwlink/?LinkId=238269).

Database.SetInitializer<DiaryAssistantContext>(null); 

이 필요합니다 :

는 것 같다 독서의 비트를 다 가졌어요. 그러나 이것은 이미 파생 된 DbContext 클래스에 있습니다.

아무도 내게 포인터를 줄 수 있습니까?

답변

6

대답은 이미 받아 들여지지만, 필자의 경우에는 좀 더 컴파일할만한 솔루션이 필요했습니다. 다음 해결책은 리플렉션을 사용하는 허용 된 대답의 예와 비슷하지만 약간의 추가 컴파일 시간 검사를 제공합니다.

Expression<Action> setInitializerExpression =() => Database.SetInitializer<MyContext>(null); 
var setInitializerCall = (MethodCallExpression) setInitializerExpression.Body; 
var setInitializerMethodInfo = 
    setInitializerCall.Method.GetGenericMethodDefinition().MakeGenericMethod(GetType()); 
setInitializerMethodInfo.Invoke(null, new object[] {null}); 
10

LINQPad는 입력 된 데이터 컨텍스트를 하위 클래스로 지정하므로 인스턴스를 참조하지 않고도 쿼리를 실행할 수 있습니다. 어쩌면 SetInitializer 메서드는 서브 클래 싱 된 형식을 필요로합니다.

이 코드 교체하면 어떻게됩니까 :이와

Database.SetInitializer<DiaryAssistantContext>(null); 

:

typeof (Database).GetMethod ("SetInitializer").MakeGenericMethod (GetType()).Invoke (null, new object[] { null }); 

를?

+0

제안 된 행을 dbcontext 파생 클래스의 생성자에 추가했으며 작동합니다 아주. 나는 왜 완전히 이해하는지 모르겠다. – dandcg

+1

GetType()은 가상이므로 Database.SetInitializer를 호출하는 것과 같습니다. (null); LINQPad에서 실행될 때 –