2

我使用的是热毛巾模板附带的 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() 的返回字符串没有关于实体的任何信息。有没有办法让它知道?还是我只是在左外野和雏菊玩耍?

4

1 回答 1

1

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

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

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

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

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

祝大家编码愉快。

跟进您的更新

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

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

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

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

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

于 2013-05-17T23:48:43.983 回答