我有一个带有车辆、汽车和公共汽车的 Breeze Web API。Car 和 Bus 类型在每个层次结构数据库结构的表中继承自 Vehicle 类型。
根据 Breeze 文档,应该能够进行相同的查询来调用本地缓存(使用 executeQueryLocally)或远程服务(使用 executeQuery)。
这在 Buses 和 Cars 的继承方案中不起作用,因为这些类型的 defaultResourceName = undefined。但奇怪的是,调用远程服务有效,但对本地缓存无效。代码解释得更好:
var EntityQuery = breeze.EntityQuery;
var manager = new breeze.EntityManager('../../breeze/breeze');
var getRemoteCars = function() {
var query = EntityQuery.from('Cars');
return manager.executeQuery(query)
.then(querySucceeded)
.fail(queryFailed);
};
function querySucceeded(data) { console.log('Retrieved Cars from remote data source'); }
function queryFailed(data) { console.log('Failed to retrieve Cars from remote data source'); }
var getLocalCars = function () {
console.log("getLocals called");
var newQuery = new EntityQuery('Cars');
var cars = manager.executeQueryLocally(newQuery);
if (cars) console.log("retrieved some cars from local cache");
else console.log("no cars retrieved from local cache");
};
getRemoteCars().then(getLocalCars);
此代码输出:
Retrieved Cars from remote data source WebApiTest.html:26
getLocals called
Q] Unhandled rejection reasons (should be empty): []
相关的错误消息被 Q.js 错误隐藏(这是一个麻烦)。Breeze.js 抛出了一个错误,它没有进入浏览器:
Cannot find an entityType for either entityTypeName: 'undefined' or resourceName: 'Cars'
事实证明,子类型(汽车和公共汽车)的 defaultResourceName = undefined。
所以我可以通过添加来解决这个问题:
manager.metadataStore.setEntityTypeForResourceName("Cars", "Car");
manager.metadataStore.setEntityTypeForResourceName("Buses", "Bus");
但这并不能解释为什么远程调用有效。
那么,首先这是一个将被修复的错误,其次,为什么远程调用在本地调用不起作用时起作用?
编辑 5 月 24 日 15:15 - 更有趣的行为......
上述对 setEntityTypeForResourceName() 的调用必须在从服务器检索元数据之后发生。但是如果你想在此之前配置 metadataStore,你可以使用完全限定名称,如下所示:
manager.metadataStore.setEntityTypeForResourceName("Cars", "Car:#VerySimpleVehicleModel.Models");
manager.metadataStore.setEntityTypeForResourceName("Buses", "Bus:#VerySimpleVehicleModel.Models");
有趣的是,使用此解决方案,Car 和 Bus 类型的 defaultResourceName 仍未定义,但本地调用有效。奇怪,不是吗??