2013-05-24 2 views
2

У меня есть веб-API Breeze с транспортными средствами, автомобилями и автобусами. Типы автомобилей и автобусов наследуются от типа транспортного средства в таблице на структуру базы данных иерархии.Breeze Entity defaultResourceName не определено для подтипов при использовании наследования

В соответствии с документами Breeze вы должны иметь возможность сделать тот же запрос для вызова либо локального кеша (с помощью executeQueryLocally), либо удаленной службы (с помощью executeQuery).

Это не работает в сценарии наследования для автобусов и автомобилей, поскольку эти типы имеют свой defaultResourceName = undefined. Но странно, что вызов удаленной службы работает, но не в локальный кеш. Код объясняет лучше:

var EntityQuery = breeze.EntityQuery; 
    var manager = new breeze.EntityManager('../../breeze/breeze'); 

    var getRemoteCars = function() { 
     var query = EntityQuery.from('Cars'); 
     return manager.executeQuery(query) 
      .then(querySucceeded) 
      .fail(queryFailed); 
    }; 
    function querySucceeded(data) { console.log('Retrieved Cars from remote data source'); } 
    function queryFailed(data) { console.log('Failed to retrieve Cars from remote data source'); } 

    var getLocalCars = function() { 
     console.log("getLocals called"); 

     var newQuery = new EntityQuery('Cars'); 
     var cars = manager.executeQueryLocally(newQuery); 
     if (cars) console.log("retrieved some cars from local cache"); 
     else console.log("no cars retrieved from local cache"); 
    }; 

    getRemoteCars().then(getLocalCars); 

Этот код выхода:

Retrieved Cars from remote data source WebApiTest.html:26 

getLocals called 

Q] Unhandled rejection reasons (should be empty): [] 

Соответствующее сообщение об ошибке скрыта ошибка Q.js (которая является неприятностью). Breeze.js бросил ошибку, не сделать его в браузер:

Cannot find an entityType for either entityTypeName: 'undefined' or resourceName: 'Cars' 

Оказывается подтипы (автомобили и автобусы) имеет defaultResourceName = не определена.

Так что я могу решить эту проблему, добавив:

manager.metadataStore.setEntityTypeForResourceName("Cars", "Car"); 
manager.metadataStore.setEntityTypeForResourceName("Buses", "Bus"); 

Но это не объясняет, почему удаленный вызов работал.

Итак, во-первых, это ошибка, которая будет исправлена, а во-вторых, почему удаленный вызов работает, когда локальный не работает?

EDIT 24 мая 15:15 - Более интересное поведение ...

выше вызов setEntityTypeForResourceName() должно произойти после того, как метаданные были получены с сервера. Но если вы хотите настроить metadataStore до этого, вы можете использовать полное имя, как это:

manager.metadataStore.setEntityTypeForResourceName("Cars", "Car:#VerySimpleVehicleModel.Models"); 
manager.metadataStore.setEntityTypeForResourceName("Buses", "Bus:#VerySimpleVehicleModel.Models"); 

Интересно, что при таком решении defaultResourceName для типов автомобилей и автобусов остается неопределенными, но работа местных вызовов. Странно, нет?

ответ

2

Мы смогли воспроизвести проблему, и это кажется ошибкой. Мы работаем над исправлением.

+1

После дальнейшего расследования мы определили, что это не ошибка. Что происходит, так это то, что EF предоставляет только имя ресурса для вершины иерархии. Поэтому, когда вы запрашиваете источник данных, поступают данные (транспортные средства), но мы действительно не знаем, являются ли это автомобили или грузовики. Теперь, при локальном запросе, вы должны точно знать, какой тип вы извлекаете. Из-за этого вы должны указать имя ресурса для типа, как вы это делали. Другим вариантом будет создание запроса как var newQuery = новый EntityQuery ('Cars'). ToType («Автомобиль»); – sbelini

Смежные вопросы