0

私たちのプロジェクトでは、サーバー上で射影クエリを実行しています。プロジェクション クエリのリソース名は、EntityType と同じ名前です。結果を受け取ると、Breeze は結果を EntityType に詰め込もうとします。コードをステップ実行した後、これはvisitAndMerge関数で発生すると思います。

if (mappingContext.query && nodeContext.nodeType === "root" && !meta.entityType) {
        meta.entityType = mappingContext.query._getToEntityType &&
        mappingContext.query._getToEntityType(mappingContext.entityManager.metadataStore);
}

_getToEntityType最終的に、_getFromEntityTypeリソースを EntityType と一致させる呼び出し。これがバグなのか、それとも Breeze のルールによるものなのかは定かではありませんが、リソース名を EntityType に一致させたくない場合があったため、この問題を取り上げることにしました。

4

1 に答える 1

0

クエリを実行する前に、Breeze はリソース名/エンティティ タイプ名マップを使用してタイプ情報を解決します。このマップは、Entity Framework バックエンドを操作するときに、EntitySet 名をリソース名として使用して自動的に更新されます。この型情報は、クエリ URL の検証と構築に使用されます。

このマップを直接更新することもできます。 Api Docs - setEntityTypeForResourceName を参照してください。1 つの entityType に、任意の数のリソース名を関連付けることができます

サーバーからデータが返されると、Breeze は次の順序に従って entityType 情報を抽出しようとします (これについては、より適切に文書化する必要があります)。

最初に、返された json ペイロードを調べ、JsonResultsAdapterを使用して、返されたエンティティのタイプを判断します。これは、複数のタイプのエンティティのグラフを取得する場合、または継承されたサブタイプを含むクエリを使用する場合に重要です。独自のJsonResultsAdapterを任意のクエリにプラグインできます。

前のステップで解決されたエンティティ タイプがない場合、Breeze はEntityQuery.toTypeメソッド呼び出しで指定されたエンティティ タイプを使用します。

前のステップで entityType が解決されず、クエリがプロジェクションではない場合、つまり select ステートメントを使用している場合、上記のマップは、クエリで指定された初期リソース名に基づいて参照されます。

お役に立てれば。

于 2013-06-14T19:17:41.163 に答える