Entity framework 林帕德;EF5代码优先
尝试对Linqpad中的dbcontext程序集运行查询时出现以下错误 InvalidOperationException:自创建数据库以来,支持“UserQuery”上下文的模型已更改。考虑使用代码第一迁移来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269) 读了一点书后,似乎:Entity framework 林帕德;EF5代码优先,entity-framework,ef-code-first,linqpad,Entity Framework,Ef Code First,Linqpad,尝试对Linqpad中的dbcontext程序集运行查询时出现以下错误 InvalidOperationException:自创建数据库以来,支持“UserQuery”上下文的模型已更改。考虑使用代码第一迁移来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269) 读了一点书后,似乎: Database.SetInitializer<DiaryAssistantContext>(null); Database.SetInitiali
Database.SetInitializer<DiaryAssistantContext>(null);
Database.SetInitializer(null);
这是需要的。但是,这已经存在于我的派生DbContext类中
有人能给我一个指针吗?LINQPad将您键入的数据上下文子类化,这样您就可以在不引用实例的情况下运行查询。可能SetInitializer方法需要子类类型 如果替换此代码,会发生什么情况:
Database.SetInitializer<DiaryAssistantContext>(null);
?虽然答案已经被接受,但在我的例子中,我想要一个编译时更友好的解决方案。以下解决方案类似于公认答案中使用反射的示例,但将提供一点额外的编译时检查:
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});
Expression setInitializeExpression=()=>Database.SetInitializer(null);
var setInitializerCall=(MethodCallExpression)setInitializerExpression.Body;
var setInitializeMethodInfo=
setInitializerCall.Method.GetGenericMethodDefinition().MakeGenericMethod(GetType());
调用(null,新对象[]{null});
我已经将您建议的行添加到dbcontext派生类的构造函数中,它工作得非常好。我不能完全理解为什么.GetType()是虚拟的,所以它相当于调用Database.SetInitializer(null);在LINQPad中运行时
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});