使用继承时,子类型的Breeze实体defaultResourceName未定义

使用继承时,子类型的Breeze实体defaultResourceName未定义,breeze,Breeze,我有一个带有车辆、汽车和公共汽车的BreezeWebAPI。汽车和公共汽车类型继承自每个层次数据库结构表中的车辆类型 根据Breeze文档,应该能够进行相同的查询来调用本地缓存(使用executeQuery local)或远程服务(使用executeQuery) 这在总线和汽车的继承场景中不起作用,因为这些类型的defaultResourceName=undefined。但奇怪的是,对远程服务的调用有效,但对本地缓存的调用无效。代码可以更好地解释: var EntityQuery = b

我有一个带有车辆、汽车和公共汽车的BreezeWebAPI。汽车和公共汽车类型继承自每个层次数据库结构表中的车辆类型

根据Breeze文档,应该能够进行相同的查询来调用本地缓存(使用executeQuery local)或远程服务(使用executeQuery)

这在总线和汽车的继承场景中不起作用,因为这些类型的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");
但这并不能解释为什么远程通话有效

那么,首先这是一个将被修复的bug,其次,为什么远程调用可以工作而本地调用不能工作

编辑5月24日15:15-更有趣的行为

上述对setEntityTypeForResourceName()的调用必须在从服务器检索元数据之后进行。但是,如果要在此之前配置元数据存储,可以使用以下完全限定名称:

manager.metadataStore.setEntityTypeForResourceName("Cars", "Car:#VerySimpleVehicleModel.Models");
manager.metadataStore.setEntityTypeForResourceName("Buses", "Bus:#VerySimpleVehicleModel.Models");

有趣的是,在这个解决方案中,Car和Bus类型的defaultResourceName仍然没有定义,但是本地调用可以工作。奇怪的是,没有???

我们能够重现这个问题,而且它看起来确实是一个bug。
我们正在进行修复。

经过进一步调查,我们确定这不是一个bug。实际情况是,EF只提供层次结构顶部的资源名称。因此,当您从数据源进行查询时,数据就来了(车辆),但我们不知道是汽车还是卡车。现在,在本地查询时,您必须确切地知道要检索的类型。因此,必须像以前那样为类型指定资源名称。另一个选项是创建一个查询,作为var newQuery=newentityquery('Cars')。toType(“Car”);