0

これは次の質問に関連しています: BreezeJS Selecting ComplexType properties

そう:

public class Person {
   public int Id {get;set;}
   public string Name {get;set;}
   public Address MyAddress {get;set;}
   public virtual ICollection<Pet> Pets {get;set;}
}

電話したい

EntityQuery.from('Person').select('id,name,pets').orderBy('id');

personBriefオブジェクトにマップします。

私はあることを知っています:

.toType("personBrief") 

拡張機能ですが、「その説明を持つオブジェクトを見つける」ようには見えず (どこでこれを定義できますか?)、オンライン ヘルプには、サポートされている複雑な型はないと書かれています。

次に、 Jumpstart HotTowel チュートリアルのmapDtosToEntities()関数を試しました

このメソッドは、配列以外のプロパティのみを正常にマップしているようです。Breeze クエリから返された Dto には、ペットコレクションが正しく設定されています。それらをko.observableArrayにループプッシュしようとしましたが、イベントは新しいエンティティに入力されますが、「コレクション ナビゲーション プロパティが設定されていない可能性があります」というエラーで風が失敗します。

最後に、初期化子で Computed を作成したいと思います。

personBrief.sumOfPetAges = ko.computed(function() {
            var sum = 0;

            person.pets().forEach(function (i) {
                sum += i.petAge();
            });
            return sum;
        });

投影後にオブジェクトグラフを保持する方法はありますか? ありがとう

4

1 に答える 1

0

PersonBriefEntityType として定義しましたか? 私は賭けていません...特に、サンプルで「personBrief」と呼んでいたことを考えると。このtoType()メソッドは、単純でフラットな既知の EntityType をキャストするためのものです。ですから、ここで少し軌道から外れていると思います。

なぜにキャストしないのPersonですか?Person マテリアルの一部が欠落していることは確かです (CCJS のように ... ただし、すべてのデータ プロパティを投影しているこの特定の例ではありません)。しかし、それは非常に簡単です。ただ書いてtoType('Person')ください。あなたはそれを試しましたか?

実際にクライアントでそのような EntityType を定義したい場合は、 docs で説明されているようにできます。その場合、toType()その型へのキャストを使用でき、Breeze はそれをキャッシュで追跡します。もちろん、そのようなものをサーバーに保存することは別の問題です。それは可能です...それは一種のDTOかもしれません...しかし、サーバーにインターセプトロジックを記述し、データを実際のサーバー側の永続エンティティに変換する必要があり、このパスは私の回答の範囲を超えています.

ここにいくつかのコードがあります...私の頭のてっぺんから書き出されました...しかし、それはあなたを正しい方向に向けるはずです。Petこれは、ComplexType ではなく EntityType であると想定していることに注意してください。現時点では、Breeze は ComplexTypes の配列をサポートしていません (サポートする予定ですが、現在はサポートしていません)。

   // 指定された MetadataStore の PersonBrief 型を定義します
   関数 addPersonBriefType(metadataStore) {
        var perType = metadataStore.getEntityType('Person');

        var type = 新しいそよ風.EntityType({
            shortName: 'PersonBrief',
            名前空間: perType.namespace
        });
        var idProperty = 新しいそよ風.DataProperty({
            nameOnServer: 'ID',
            データ型:そよ風.DataType.Int32、
            isPartOfKey: 真、
        });
        type.addProperty(idProperty);
        type.addProperty(新しいそよ風.DataProperty({ nameOnServer: '名前' }));

        // Pets コレクションを定義する方法は次のとおりです
        // 既にメタデータに Pet タイプがあり、
        // Person に戻る逆ナビゲーションがあります
        // Person から Pets へのナビゲーション プロパティを取得します
        var assoc = perType.getNavigationProperty('ペット');

        type.addProperty(新しいそよ風.NavigationProperty({
            nameOnServer: 'ペット',
            isScalar: false, // コレクションです
            entityTypeName: assoc.entityType.name,
            外部キー名: assoc.inverse.外部キー名、
            AssociationName: assoc.associationName
        }));

        metadataStore.addEntityType(タイプ);
        戻り型;
    }

に相当する DocCode サンプルEmployeePartialmetadataTests.jsで、このようなことを行うことができましPetsOrders。比較可能な射影クエリは次のとおりです。

var query = Breeze.EntityQuery.from('従業員')
    .where('EmployeeID', 'eq', 1)
    .select('EmployeeID, FirstName, LastName, Orders')
    .toType('EmployeePartial')

補足するタイプsumOfPetAgesがあるため、計算されたものは機能するはずです。PersonBrief

私は確かにそれを自分で翼をつけています。私がここに書いたコードのこの特定のビットに誓うことができなくても、それが機能することは知っています. これがどうなるか教えてください。

PersonBriefps からにナビゲートできるはずですが、 a から aにPets戻ることを期待しないでください。そのナビゲーション プロパティは定義されていません。PetPersonBrief

于 2013-05-22T02:36:06.310 に答える