2012-08-29 14 views
9

Ottenere il seguente errore quando si tenta di eseguire una query su un assembly dbcontext in Linqpad.Linqpad e codice EF5 prima

InvalidOperationException: il modello di backup del contesto "UserQuery" è stato modificato da quando il database è stato creato. Prendi in considerazione l'utilizzo di Code First Migrations per aggiornare il database (http://go.microsoft.com/fwlink/?LinkId=238269).

Dopo aver fatto un po 'di lettura sembra che:

Database.SetInitializer<DiaryAssistantContext>(null); 

è necessario. Tuttavia questo è già nella mia classe DbContext derivata.

Qualcuno può darmi un puntatore?

risposta

6

Mentre una risposta è già stata accettata, nel mio caso volevo una soluzione che fosse un po 'più adatta alla compilazione. La seguente soluzione è simile all'esempio nella risposta accettato che utilizza la riflessione, ma fornirà un piccolo extra di controllo in fase di compilazione:

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 sottoclasse il contesto dei dati digitati in modo da poter eseguire query senza fare riferimento all'istanza. Forse il metodo SetInitializer richiede il tipo sottoclasse.

Che cosa succede se si sostituisce questo codice:

Database.SetInitializer<DiaryAssistantContext>(null); 

con questo:

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

?

+0

ho aggiunto la linea suggerito al costruttore della classe DbContext derivata e funziona perfettamente. Non sono sicuro di aver capito bene perché. – dandcg

+1

GetType() è virtuale, quindi equivale a chiamare Database.SetInitializer (null); quando eseguito in LINQPad –

Problemi correlati