【问题标题】:Angular/Breeze SPA loading local data from webAPI service to unmapped entityAngular/Breeze SPA 将本地数据从 webAPI 服务加载到未映射的实体
【发布时间】:2014-12-02 23:25:28
【问题描述】:

我正在关注 John Papa 关于 AngularJS/Breeze SPA 应用程序的精彩复数课程(第 1 部分),并根据我的特殊情况制作模组。

我有用于下拉列表的 Products 和 Uoms 的参考数据。我想从微风本地缓存中加载这些,而不是一直访问服务器。我可以从服务器检索它们,但我不知道以后如何从微风中查询它们。

数据作为 id/name 对对象列表在服务器端公开,这些对象不属于 Entity Framework 公开的 metadataStore 的一部分。在调用服务器获取数据之前,我将这些实体类型添加到微风中。

我是这样创建未映射的 EntityTypes 的:

  createReferenceEntity('Products');
  createReferenceEntity('Uoms');

  function createReferenceEntity(entityName) {

    // add reference/lookup client-side only entity type
    var et = new breeze.EntityType({
      shortName: entityName,
      namespace: "Model"
    });

    et.addProperty(new breeze.DataProperty({
      name: "id",
      dataType: breeze.DataType.Int32,
      isNullable: false,
      isPartOfKey: true,
    }));

    et.addProperty(new breeze.DataProperty({
      name: "name",
      dataType: breeze.DataType.String,
      isNullable: false,
    }));

    metadataStore.addEntityType(et);
  }

这是我的 Breeze 控制器中的内容:

    [HttpGet]
    public object Lookups()
    {
        // List<ReferenceObject> which is an Id and a Name
        var Products = _repository.Products; 
        var Uoms = _repository.Uoms;
        return new { Products, Uoms };
    }

所以我从 javascript 调用控制器:

    return EntityQuery.from('Lookups').using(manager)
    .execute().then(querySucceeded, _queryFailed);

查询成功。我在 FireBug Net 窗口中看到的内容看起来没问题。所以数据是通过网络传输的。

所以我似乎无法做的是再次查询查找数据。它不应该在微风缓存中吗?这就是我正在尝试的。返回为空:

    _getReferenceData('Products', 'name');

    function _getReferenceData( resource, ordering) {
      return EntityQuery.from(resource)
             .orderBy(ordering)
             .using(manager)
             .executeLocally();
    }

也许服务器没有以正确的格式通过网络提供序列化对象?我没有正确查询微风?

我真的很感谢这里的任何建议,因为我在试图弄清楚这一点时变得有点睡眼惺忪。

谢谢! 科里。

【问题讨论】:

    标签: c# angularjs entity-framework asp.net-web-api breeze


    【解决方案1】:

    我首先注意到您可能希望将defaultResourceName 添加到每个类型定义中。 defaultResourceName 是从数据库中检索类型的主要路径。这是 Breeze 在手动加载导航路径(例如 order.entityAspect.loadNavigationPath('OrderDetails'))时使用的。通常这是实体名称的复数形式(例如,名为“Product”的实体的“Products”)。

    然后我在您的评论中看到您正在为类型(“Products:#Model”)设置路径(“Products”),这很好但不是一回事(setEntityTypeForResourceName 定义了资源路径但不是默认资源路径)。

    然后我意识到您的类型名称是 Products 复数,而不是 Product 单数。那正确吗?这当然不是传统的。

    我敢打赌,您的服务器将实体类型名称序列化为“产品”......这不是您的一种类型的名称。

    如果我们从您的查找查询中看到其中一个实体的 JSON 序列化形式,我们可能会更确定答案。您可以从浏览器开发人员工具的“网络”选项卡中复制它并将其粘贴到您的答案中。谢谢。

    【讨论】:

      【解决方案2】:

      我想你需要打电话给setEntityTypeForResourceName:

      metadataStore.setEntityTypeForResourceName("Products", "Product:#Model");
      metadataStore.setEntityTypeForResourceName("Uoms", "Uom:#Model");
      

      那么 EntityManager 可以知道,当您使用“Products”资源名称时,它应该查询“Product”实体。通常 Breeze 从服务器返回的元数据中获取此信息,但由于您在本地创建 EntityTypes,因此您需要提供信息。

      【讨论】:

      • 感谢您的回复!原来我已经有了这个。我把它放在一个循环中,但我确实看到正在运行 metadataStore.setEntityTypeForResourceName('Products', 'Products:#Model')。至少这告诉我它是元数据的一部分,对吧?
      • 注意史蒂夫的“Product:#Model”和你的“Products:#Model”之间的区别。你说的是“产品”的复数形式。他说的是“产品”单数。实际上,您命名类型的方式,复数“产品”是“正确的”。但我怀疑“产品”是您真正想要的类型名称。请参阅下面的答案。
      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2011-01-13
      相关资源
      最近更新 更多