Linqpad& EF5 Code First

时间:2012-08-29 16:50:05

标签: entity-framework ef-code-first linqpad

尝试在Linqpad中对dbcontext程序集运行查询时出现以下错误。

  

InvalidOperationException:自创建数据库以来,支持“UserQuery”上下文的模型已更改。请考虑使用“代码优先迁移”来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

做了一些阅读后,似乎:

Database.SetInitializer<DiaryAssistantContext>(null);

是必需的。但是,这已经在我的派生DbContext类中。

有人可以给我一个指针吗?

2 个答案:

答案 0 :(得分:10)

LINQPad是您键入的数据上下文的子类,因此您可以在不引用实例的情况下运行查询。也许SetInitializer方法需要子类型。

如果替换此代码会发生什么:

Database.SetInitializer<DiaryAssistantContext>(null);

用这个:

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

答案 1 :(得分: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});