2012-08-29 93 views
9

尝试对Linqpad中的dbcontext程序集运行查询时出现以下错误。Linqpad&EF5 Code First

InvalidOperationException:自创建数据库以来,支持“UserQuery”上下文的模型已更改。考虑使用Code First Migrations来更新数据库(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方法需要subclassed类型。

,如果你将这段代码会发生什么:

Database.SetInitializer<DiaryAssistantContext>(null); 

与此:

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

+0

我加入您的建议行到的DbContext派生类的构造函数,它的工作原理完美。我不确定完全理解为什么。 – dandcg

+1

GetType()是虚拟的,所以它相当于调用Database.SetInitializer (null);当在LINQPad中运行时 –