2

車、車、バスを含む Breeze Web API があります。車とバスのタイプは、階層データベース構造ごとのテーブルの車両タイプから継承します。

Breeze docs によると、同じクエリを作成して、ローカル キャッシュ (executeQueryLocally を使用) またはリモート サービス (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");

しかし、それではリモート呼び出しが機能した理由は説明できません。

第一に、これは修正されるバグであり、第二に、なぜローカル呼び出しが機能しないのにリモート呼び出しが機能するのでしょうか?

EDIT 24 May 15:15 - もっと面白い振る舞い...

上記の setEntityTypeForResourceName() の呼び出しは、メタデータがサーバーから取得された後に行う必要があります。ただし、これより前に metadataStore を構成したい場合は、次のように完全修飾名を使用できます。

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

興味深いことに、このソリューションでは、Car および Bus タイプの defaultResourceName は未定義のままですが、ローカル呼び出しは機能します。奇妙ですよね??

4

1 に答える 1

2

問題を再現できましたが、バグのようです。修正に取り組んでいます。

于 2013-05-29T02:15:18.407 に答える