【问题标题】:Breeze: cannot execute _executeQueryCore until metadataStore is populatedBreeze:在填充 metadataStore 之前无法执行 _executeQueryCore
【发布时间】:2013-05-22 04:47:33
【问题描述】:

我使用的是热毛巾模板附带的 Breeze v1.1.2,该模板现已扩展为我的项目。我犯了将 NuGet 包更新到当前 1.3.3 的错误(我从未学习过)。无论如何,一切都很好,现在没有那么多了!

我按照发行说明和其他文档中的说明将 BreezeWebApiConfig 文件更改为:

[assembly: WebActivator.PreApplicationStartMethod(
typeof(BreezeWebApiConfig), "RegisterBreezePreStart")]
namespace MyApp.App_Start {
public static class BreezeWebApiConfig {
    public static void RegisterBreezePreStart() {
      GlobalConfiguration.Configuration.Routes.MapHttpRoute(
          name: "BreezeApi",
          routeTemplate: "breeze/{controller}/{action}"
      );}}}

还有 config.js 文件(它为 EntityManager 构造函数提供 serviceName):

var remoteServiceName = 'breeze/breeze';  // NEW version
//var remoteServiceName = 'api/breeze';  // OLD version

如果您有兴趣,还有我的 BreezeController:

[BreezeController]
public class BreezeController : ApiController
{
    readonly EFContextProvider<MyDbContext> _contextProvider =
        new EFContextProvider<MyDbContext>();

    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    [HttpGet]
    public IQueryable<SomeItem> SomeItems()
    {
        // Do stuff here...
    }
}

现在我收到“在填充 metadataStore 之前无法执行 _executeQueryCore”错误。

我在这里缺少什么?

编辑: 我可能遗漏了您需要的部分……在上面的 SomeItems() 方法中,实际完成的是对 MyDBContext 类中的 GetMeSomeData() 方法的调用。此方法对存储过程进行以下调用以获取数据。

public virtual ObjectResult<SomeItem> GetMeSomeData(string inParam)
    {
        var p = new object[] { new SqlParameter("@inParam", inParam) };
        var retVal = ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<SomeItem>("exec GetData @SN", p);
        return retVal;
    }

现在鉴于我有限的理解,对 Metadata() 的调用并没有失败,但我认为它不知道返回时实体模型是什么,即使在某个地方,它应该弄清楚这一点来自我拥有的实体模型(即 SomeItem)? Metadata() 的返回字符串没有关于实体的任何信息。有没有办法让它知道?还是我只是在左外野玩雏菊?

【问题讨论】:

    标签: metadata breeze hottowel


    【解决方案1】:

    根据这份报告很难说。让我们看看微风是否正确。

    打开浏览器调试工具,查看网络流量。在收到该错误之前,您是否看到有人尝试从服务器获取元数据?如果是这样,它成功了吗?还是404?还是500?错误是什么?

    我敢打赌它甚至没有尝试过。如果没有,通常的原因是您在第一次查询之前尝试了一些 Breeze 操作......并且您也没有明确要求元数据。您是否尝试创建实体?这需要元数据。

    关键是,您必须追踪导致错误的 Breeze 操作。当然,一切都应该正常工作。世界应该是彩虹和独角兽。如果不是,我们叹了口气,打开调试器,然后从错误给我们的信息开始。

    对于其他人来说...升级到新的 Breeze 版本是件好事。

    祝大家编码愉快。

    跟进您的更新

    Breeze 不知道您如何在后端获取数据。如果查询结果中有一个可识别的实体,Breeze 会缓存它。在查询回调中仍然由您来确保您传递给调用者的内容是有意义的。

    你说你是服务器端元数据方法不知道SomeItem是什么?那么它对客户来说并没有多大用处。如果它返回一个空字符串,Breeze 可能会将其视为“根本没有元数据”,在这种情况下,您应该收到“在填充 metadataStore 之前无法执行 _executeQueryCore”错误消息。顺便说一句,您是否检查了网络流量以确定您的服务器在响应元数据请求时实际返回了什么(或者是否有这样的请求)?

    有很多方法可以在服务器上创建元数据。最简单的方法是使用 EF ...至少在设计时作为建模工具。你的MyDbContext 里面是什么?为什么里面没有SomeItem?

    如果您不想从服务器生成元数据,也可以在客户端创建元数据。您必须告诉 Breeze 客户您已做出该选择。大部分内容在文档 "Metadata Format" 中进行了解释。

    我感觉你有点想入非非。你想偏离幸福的道路……这很酷。但我们大多数人在跑步之前需要先学会走路。

    【讨论】:

    • 我在上面添加了一些附加信息。还有什么想法吗?
    • 我正在使用 EF5 和存储过程。我已经阅读了大部分 Breeze 文档,但没有看到任何关于此的内容。你说过这是可行的here 如果我手动滚动实体/DbContext,我会在这篇文章的标题中看到错误。如果我使用 emdx,我会得到“找不到 SomeItem 的 CLR 类型”。所有网络流量为 200,包括元数据。 SomeItem 在 GetMeSomeData() 中作为返回类型 (ObjectResult),然后控制器返回 .AsQuerable()。不幸的是,我需要使用 sprocs 和 EF5。
    • 存储过程不是问题。关于SomeItem缺少元数据是问题。没有元数据,不行。好消息是,在您向控制器询问 SomeItem 之前,您的元数据请求获得了 200。该元数据中有什么? SomeItem 在那里。如果没有,你必须采取措施。见here for info on creating client-side metadata。您还可以使用 EF 作为设计工具在服务器上轻松生成元数据,但我们会坚持下去。首先......元数据中是否有SomeItem?如果没有,请尝试客户端 def。
    • 在创建SomeItem 的客户端定义并设置hasServerMetadata=false 后工作(现在不调用Metadata() 方法)。但是,我们是一个包含 100 个存储过程的数据仓库,需要 100 个实体。我看不到让 edmx 函数导入创建实体,然后必须在客户端再次手动构建它们。我想我错过了一些东西。 :-(
    • 在服务器端,您是否将 sproc 调用的结果倒入 CLR 类中?还是您正在使用原始数据?如果您有 CLR 类,即使您无法以通常的 EF 方式查询数据库,您也可以为它们生成元数据。除非您确认您有一个带有 CLR 类的服务器端模型,该模型与您的查询存储过程的输出相对应,否则我对此毫无意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多