2012-08-29 6 views
9

Linqpadのdbcontextアセンブリに対してクエリを実行しようとすると、次のエラーが発生します。Linqpad&EF5 Code First

InvalidOperationException:データベースが作成されてから 'UserQuery'コンテキストをサポートするモデルが変更されました。コードの最初の移行を使用してデータベースを更新することを検討してください(http://go.microsoft.com/fwlink/?LinkId=238269)。

Database.SetInitializer<DiaryAssistantContext>(null); 

が必要とされています。それを読んで少しやった

がいるようです。しかし、これは既に私の派生したDbContextクラスにあります。

誰でも私にポインタを与えることができますか?

答えて

6

答えはすでに受け入れられていますが、私の場合は、もう少しコンパイル時間の良いソリューションがほしいと思っていました。私はdbcontext派生クラスのコンストラクタにあなたの提案の行を追加しているし、それが動作

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

:次のソリューションは、リフレクションを使用して受け入れ答えの例に似ていますが、少し余分なコンパイル時のチェックを提供します完全に。しかし、私はなぜそれを完全に理解するか分からない。 – dandcg

+1

GetType()は仮想なので、Database.SetInitializerを呼び出すのと同じです。(null); LINQPadで実行すると –

関連する問題