使用继承时,Breeze Entity defaultResourceName未定义为子类型

时间:2013-05-24 03:53:57

标签: breeze

我有一个带有车辆,汽车和公共汽车的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'

事实证明子类型(Car和Bus)的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仍未定义,但本地调用有效。奇怪,没有??

1 个答案:

答案 0 :(得分:2)

我们能够重现这个问题,它似乎确实是一个错误。 我们正在努力修复。