我正在关注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>
谢谢! 科里。
答案 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,因此您需要提供信息。