Linqpad和EF5代码优先

dan*_*dcg 9 entity-framework linqpad ef-code-first

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

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

做了一些阅读后,似乎:

Database.SetInitializer<DiaryAssistantContext>(null);
Run Code Online (Sandbox Code Playgroud)

需要.但是,这已经在我的派生DbContext类中.

任何人都可以给我指针吗?

Joe*_*ari 10

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

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

Database.SetInitializer<DiaryAssistantContext>(null);
Run Code Online (Sandbox Code Playgroud)

有了这个:

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

?


Jus*_*zer 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});
Run Code Online (Sandbox Code Playgroud)