【问题标题】:Linqpad & EF5 Code FirstLinqpad 和 EF5 代码优先
【发布时间】:2012-08-29 16:50:05
【问题描述】:

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

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

读了几遍好像是这样的:

Database.SetInitializer<DiaryAssistantContext>(null);

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

谁能指点一下?

【问题讨论】:

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


    【解决方案1】:

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

    如果你替换这段代码会发生什么:

    Database.SetInitializer<DiaryAssistantContext>(null);
    

    用这个:

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

    ?

    【讨论】:

    • 我已将您建议的行添加到 dbcontext 派生类的构造函数中,并且效果很好。不过,我不确定完全理解为什么。
    • GetType() 是虚拟的,所以相当于调用 Database.SetInitializer(null);在 LINQPad 中运行时
    【解决方案2】:

    虽然已经接受了一个答案,但就我而言,我想要一个对编译时更友好的解决方案。以下解决方案类似于使用反射的已接受答案中的示例,但会提供一些额外的编译时检查:

    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});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2013-12-29
      • 1970-01-01
      相关资源
      最近更新 更多