0

わかりました、これを別の方法で尋ねましたが、まだ回答を見ていないので、質問を単純化しようとしています -

複数のエンティティを作成し、Breeze で「追加された」entityState に残したい。次に、それらのオブジェクトのみを返し、ナビゲーション プロパティを介して親にバインドし直します。

var createEntities = function (parent) {
    manager.createEntity('child', {parentId = parent.id()});
};

次に、親を照会し、追加ビュー用に作成されたエンティティのみを返します-

var getThoseDamnedEntities = function (parentObservable) {
        var query = EntityQuery.from('Parents')
            .where('id', '==', parentObservable.id())
            .expand('Child');

        return manager.executeQuery(query)
            .then(querySucceeded)
            .fail(queryFailed);

        function querySucceeded(data) {
            if (parentObservable) {
                parentObservable(data.results);
            }
            log('Retrieved [Parent] from remote data source',
                data, true);
        }
};

しかし、entityState.Added で子の結果をフィルター処理して、まだ保存されていない新しいエンティティのみを返し、保存する前に変更できるようにしたいと考えています。助言がありますか?

これを詳しく説明するには、タイプ別にエンティティを直接クエリし (つまり、query = EntityQuery.from('Child').where())、コンストラクターを使用して、「追加済み」エンティティ専用の ko.computed プロパティを取得できます。しかし、それらをクエリして、ナビゲーションプロパティを介して親オブジェクトにバインドする方法をまだ理解できません(用語を台無しにして申し訳ありません:))

4

1 に答える 1

1

私があなたの質問を理解したと仮定すると、実際にはこれに対して取ることができるいくつかのアプローチがあります。

まず、「追加された」エンティティが見つかる唯一の場所であるため、entityManager のローカル キャッシュのみをクエリする必要があります。それらはまだ保存されていません (したがって、まだ「追加済み」としてマークされています)。これを行うには、上記のクエリの逆をローカル キャッシュに対してのみ実行します。(ここでエンティティタイプとプロパティ名について推測しています)

var query = EntityQuery.from('Children')
        .where('parent_id', '==', parentObservable.id())
        .using(FetchStrategy.FromLocalCache).then(...)

プロミスを返すか、同期して同じことを行うことができます

var query = EntityQuery.from('Children')
        .where('parent_id', '==', parentObservable.id()) ;
var localChildren = myEntityManager.executeQueryLocally(query);

これにより、フィルターに一致するローカル キャッシュ内のすべてのエンティティが返されるため、「追加済み」のものだけが必要な場合は、「localParents」をさらにフィルター処理する必要があります。

var addedLocalChildren = localChildren.filter(function(p) {
   return p.entityAspect.entityState.isAdded();
})

さらに単純なもう 1 つのアプローチは、外部キーを介して親エンティティを子に既にリンクしている場合、entityManager キャッシュ内のすべてのエンティティのナビゲーション プロパティが既に解決されているという考えに基づいています。これは、次のことを簡単に実行できることを意味します。

var children = parentObservable().child;  // 'children' might be a better name for this prop
var addedLocalChildren = children.filter(function(p) {
   return p.entityAspect.entityState.isAdded();
})

これが理にかなっていることを願っています。

于 2013-05-06T21:38:41.103 に答える