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

标签 breeze

我有一个带有车辆、汽车和公共(public)汽车的 Breeze Web API。汽车和巴士类型继承自每个层次结构数据库结构表中的车辆类型。

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

这在公共(public)汽车和汽车的继承场景中不起作用,因为这些类型的 defaultResourceName = 未定义。但奇怪的是,对远程服务的调用有效,但对本地缓存无效。代码解释得更好:

    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'

事实证明,子类型(汽车和公共(public)汽车)的 defaultResourceName = 未定义。

所以我可以通过添加来解决问题:

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");

有趣的是,使用此解决方案,汽车和巴士类型的 defaultResourceName 保持未定义,但本地调用有效。奇怪,不是吗?

最佳答案

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

关于使用继承时,Breeze Entity defaultResourceName 未定义子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16727432/

相关文章:

linq - Breeze where 查询 EF 中带有中间实体的多对多

javascript - Breeze 导航属性不是在元数据中创建的

javascript - Breezejs 自定义 backingStore 适配器

javascript - BreezeJs,saveChanges() - 未捕获的类型错误 : Cannot read property 'statusText' of undefined

breeze - 有什么方法可以减少breeze.js 有效负载大小,或者我不应该担心它吗?

javascript - AngularJS 异步调用多个数据库并且保存顺序不正确

angularjs - AngularJs 的数据持久化库

breeze - 能否在属性更改时验证新创建的实体,而不是在保存时

mocking - 在breezejs上实现模拟数据服务(查询失败)

c# - Breeze.Sharp - 需要能够在 DataService 的 HttpClient 构造中指定 UseDefaultCredentials