2012-08-29 15 views
9

Obtener el siguiente error al intentar ejecutar una consulta en un ensamblado de dbcontext en Linqpad.Código de Linqpad y EF5 Primero

InvalidOperationException: El modelo que respalda el contexto 'UserQuery' ha cambiado desde que se creó la base de datos. Considere usar Code First Migrations para actualizar la base de datos (http://go.microsoft.com/fwlink/?LinkId=238269).

haber hecho un poco de lectura, parece que: se necesita

Database.SetInitializer<DiaryAssistantContext>(null); 

. Sin embargo, esto ya está en mi clase DbContext derivada.

¿Alguien puede darme un puntero?

Respuesta

6

Si bien ya se ha aceptado una respuesta, en mi caso quería una solución que fuera un poco más amigable en tiempo de compilación. La siguiente solución es similar al ejemplo de la respuesta aceptada que utiliza la reflexión, pero proporcionará un poco de comprobación en tiempo de compilación adicional:

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 subclasifica el contexto de datos tipeados para que pueda ejecutar consultas sin hacer referencia a la instancia. Tal vez el método SetInitializer necesita el tipo de subclase.

¿Qué pasa si se reemplaza este código:

Database.SetInitializer<DiaryAssistantContext>(null); 

con esto:

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

?

+0

he añadido la línea sugerida al constructor de la clase dbcontext derivados y funciona perfectamente. No estoy seguro de entender por qué sin embargo. – dandcg

+1

GetType() es virtual, por lo que es equivalente a llamar a Database.SetInitializer (null); cuando se ejecuta en LINQPad –

Cuestiones relacionadas