2012-08-29 10 views
9

Beim Versuch, eine Abfrage für eine dbcontext-Assembly in Linqpad auszuführen, wird der folgende Fehler angezeigt.Linqpad & EF5-Code zuerst

InvalidOperationException: Das Modell der ‚Userquery‘ Kontext Sicherung geändert hat, da die Datenbank erstellt wurde. Erwägen Sie, Code First Migrations zu verwenden, um die Datenbank zu aktualisieren (http://go.microsoft.com/fwlink/?LinkId=238269).

ein bisschen zu lesen getan zu haben, es scheint, dass:

Database.SetInitializer<DiaryAssistantContext>(null); 

benötigt wird. Dies ist jedoch bereits in meiner abgeleiteten DbContext-Klasse.

Kann mir jemand einen Zeiger geben?

Antwort

6

Während eine Antwort bereits akzeptiert wurde, wollte ich in meinem Fall eine Lösung, die etwas kompilierfreundlicher war. Die folgende Lösung ist ähnlich dem Beispiel in der Antwort akzeptiert, die Reflexion verwendet, aber ein wenig mehr Kompilierung-Kontrolle bieten:

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 leitet Ihren typisierten Datenkontext ab, damit Sie Abfragen ausführen können, ohne auf die Instanz zu verweisen. Möglicherweise benötigt die SetInitializer-Methode den Unterklasse-Typ.

Was passiert, wenn Sie diesen Code ersetzen:

Database.SetInitializer<DiaryAssistantContext>(null); 

mit diesem:

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

?

+0

ich Ihre vorgeschlagene Linie an den Konstruktor der DbContext abgeleiteten Klasse hinzugefügt haben und es funktioniert perfekt. Ich bin mir aber nicht ganz sicher warum. – dandcg

+1

GetType() ist virtuell, entspricht also dem Aufruf von Database.SetInitializer (null); wenn in LINQPad ausgeführt –