Внедрение фиктивного сервиса данных на breezejs (сбой запроса)

Я пытаюсь реализовать фиктивный сервис данных. Я регистрирую новый тип данных, создаю новый объект с данными инициализации, но при выполнении запроса получаю сообщение об ошибке: «Для этого запроса нет доступных метаданных». Я не могу понять, почему это происходит. Мой менеджер сущностей содержит тип данных, который я зарегистрировал, а также набор созданных сущностей. Я думал, что мой запрос не работает из-за пространства имен, поэтому я попытался запросить "Tag:#Football.Models" - тот же результат. Также я пробовал метод executeLocally(), то же самое...

Шаги:

1) Создать бриз dataservice, хранилище данных и менеджер.

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
               });;

person Sergey Romanchuk    schedule 25.03.2013    source источник


Ответы (1)


Обновление с версии 1.2.7

Вам больше не нужно вызывать методы setEntityTypeForResourceName или addDataService, чтобы выполнить описанную вами настройку имитации.

--- Предыдущий ответ ----------------------------------------

Вы очень близки. Все, что вам нужно сделать, это добавить следующие две строки

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

после этой строки

   mockMetadataStore.addEntityType(et);

Ни один из них на самом деле не требуется в этом случае, но пока они есть. Необходимость в этом «лишнем» коде будет устранена в следующем выпуске. Эти методы по-прежнему полезны, но не в этом конкретном случае.

Кроме того, вы должны изменить предложение defaultResourceName или предложение EntityQuery.from, чтобы имена совпадали. (Это включает случай - см. комментарий ниже).

Причина в том, что defaultResourceName – это имя запрашиваемой "коллекции/ресурса", а не имя "entityType", т. е. имена ресурсов – это то, что вы передаете в EntityQuery.from. Хорошим соглашением является то, что имя ресурса является множественной версией имени entityType, которое он запрашивает, хотя это ни в коем случае не требуется. Таким образом, вы можете изменить либо предложение «от», либо «имя ресурса по умолчанию».

Примечание: несколько ресурсов могут возвращать один и тот же тип объекта, следовательно, «по умолчанию» в имени «defaultResourceName».

Кроме того, через преобразование namingConventions проходят только имена свойств, поэтому имена ресурсов должны быть точно такими, какими их ожидает сервер.

person Jay Traband    schedule 25.03.2013
comment
Да, есть довольно запутанная вещь в явном добавлении службы данных в хранилище метаданных. Я думал, что они были подключены после того, как я передал ссылки metadataStore и dataService в entityManager. Хорошо, что вы собираетесь удалить этот дополнительный код. Я предполагаю, что причина, по которой вы не удалите этот метод, заключается в том, что хранилище метаданных подключено к нескольким службам данных, и это неплохая функция. Не в моем случае, но тем не менее =) - person Sergey Romanchuk; 26.03.2013