車、車、バスを含む 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 は未定義のままですが、ローカル呼び出しは機能します。奇妙ですよね??