Angular / Breeze SPA将本地数据从Web API服务加载到未映射的实体

时间:2014-12-01 02:54:53

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

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

我有Products和Uoms的参考数据,这些数据用于下拉列表。我想从breeze本地缓存加载这些,而不是一直打到服务器。我可以从服务器中检索它们,但我无法弄清楚如何从微风中查询它们。

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

以下是我创建未映射的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窗口中看到的内容看起来没问题。因此,数据正在通过网络传播。

所以我似乎无法做的就是再次查询查找数据。它不应该在Breeze缓存中吗?这就是我想要的。回来是空的:

    _getReferenceData('Products', 'name');

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

也许服务器没有以正确的格式提供线路上的序列化对象?我不是在正确地查询微风?

我真的很感激这里有任何建议,因为我正试图弄清楚这一点。[/ p>

谢谢! 科里。

2 个答案:

答案 0 :(得分:1)

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

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

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

我打赌您的服务器正在将实体类型名称序列化为“产品”... 您的某个类型的名称。

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

答案 1 :(得分:0)

我认为您需要致电setEntityTypeForResourceName

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

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