2

模擬データサービスを実装しようとしています。新しいデータ型を登録し、initデータを使用して新しいエンティティを作成していますが、クエリを実行すると、「このクエリに使用できるメタデータがありません」というエラーが表示されます。なぜそれが起こったのか理解できません。私のエンティティマネージャーには、登録したデータ型が含まれています。また、作成されたエンティティのコレクションも含まれています。名前空間が原因でクエリが失敗したと思ったので、「Tag:#Football.Models」をクエリしようとしました。同じ結果です。また、executeLocally()メソッドを試しましたが、同じものです...

手順:

1)そよ風のデータサービス、データストア、マネージャーを作成します。

2)新しいメタデータタイプを作成し、データストアに追加します。

3)登録されたタイプの新しいエンティティを作成し、いくつかのモックデータで初期化します。

4)クエリを実行してエンティティのコレクションを取得します。手順4で失敗します-エラーが発生します:「エラー:このクエリに使用できるメタデータがありません」

これが私のコードです:

          //1st step
           var mockDataService = new breeze.DataService({
                serviceName: "mockDataService",
                hasServerMetadata: false
            });

            var mockMetadataStore = new breeze.MetadataStore(
                {
                    namingConvention: breeze.NamingConvention.camelCase
                });

            var queryOptions = new breeze.QueryOptions({
                fetchStrategy: breeze.FetchStrategy.FromLocalCache
            });

            var entityManager = new breeze.EntityManager({
                dataService: mockDataService,
                metadataStore: mockMetadataStore,
                queryOptions: queryOptions
            });
           // 2nd step
            var et = new breeze.EntityType({
                shortName: "Tag",
                namespace: "Football.Models",
                autoGeneratedKeyType: breeze.AutoGeneratedKeyType.Identity,
                defaultResourceName: "tags"
            });
            et.addProperty(new breeze.DataProperty({
                name: "id",
                dataType: breeze.DataType.Int32,
                isNullable: false,
                isPartOfKey: true
            }));
            et.addProperty(new breeze.DataProperty({
                name: "name",
                dataType: breeze.DataType.String,
                isNullable: false
            }));
            mockMetadataStore.addEntityType(et);
            mockMetadataStore.registerEntityTypeCtor("Tag", null);
                //3rd step 
                etType = mockMetadataStore.getEntityType("Tag");
            var newTag = etType.createEntity({id:1,name:"tag"});
            entityManager.addEntity(newTag);
                // 4th step
                var a =  breeze.EntityQuery
              .from("Tag")
              .using(entityManager).execute()
              .then(querySucceed).fail( function(err) {
                    alert(err);
                                // and i got an error:
                                // Error: There is no metadata available for this query
               });;
4

1 に答える 1

2

バージョン1.2.7以降の更新

説明したモック設定を実行するために、 setEntityTypeForResourceNameメソッドまたはaddDataServiceメソッドを呼び出す必要はありません。

---前の回答----------------------------------------

あなたはとても近いです。次の2行を追加するだけです

   mockMetadataStore.setEntityTypeForResourceName("Tag", et); // or "Tags"
   mockMetadataStore.addDataService(mockDataService);

この行の後

   mockMetadataStore.addEntityType(et);

この場合、これらのどちらも実際には必要ありませんが、今のところ必要です。この「余分な」コードの必要性は、次のリリースで削除されます。これらの方法は依然として有用ですが、この特定の場合には役立ちません。

また、名前が一致するように、defaultResourceNameまたはEntityQuery.from句のいずれかを変更する必要があります。(これにはケースが含まれます-以下のコメントを参照してください)。

その理由は、defaultResourceNameが、クエリを実行している「コレクション/リソース」の名前であり、「entityType」の名前ではないためです。つまり、リソース名は、EntityQuery.from句に渡すものです。リソース名は、クエリするentityType名の複数形ですが、これは必須ではありません。したがって、「from」句または「defaultResourceName」のいずれかを変更できます。

ちなみに、複数のresourceNameは同じentityTypeを返す可能性があるため、「defaultResourceName」という名前の「default」になります。

さらに、プロパティ名のみがnamingConventionsの変換を通過するため、resourceNamesは、サーバーが期待するとおりの名前である必要があります

于 2013-03-25T18:39:34.323 に答える