Breeze.js — ошибка при попытке использовать любой оператор — ошибка: невозможно получить значение свойства «isAnonymous»: объект имеет значение null или не определен

Я пытаюсь использовать оператор «любой» в Breeze для запроса множества таблиц и получаю следующую ошибку: TypeError: невозможно получить значение свойства «isAnonymous»: объект имеет значение null или не определен

Единственный вопрос, связанный с переполнением стека, который я могу найти, это этот вопрос, но нет решения проблемы isAnonymous, потому что постер не предоставил больше кода:

бриз-проекция: ошибка при выборе нескалярных свойств навигации

Я использую Breeze 1.4.11 с Entity Framework 5.

Запрос, который я пытаюсь запустить,

var getEntities = function (entitiesObservable) {
    var whereClause = "";

    whereClause = Predicate.create("t_entity_nm", "any", "frst_nm", "startsWith", "Frank");

    var query = EntityQuery.from("Entities")
                           .where(whereClause)
                           .expand("t_entity_nm");

    $('#loading-indicator').show();
    return manager.executeQuery(query)
                  .then(querySucceeded)
                  .fail(queryFailed);

    function querySucceeded(data) {
        $('#loading-indicator').hide();
        if (entitiesObservable) {
            entitiesObservable(data.results);
        }
        log("Retrieved [Entities] from remote data source", data, true);
    }
};

t_entity присоединяется к t_entity_nm на entity_sys_key_id...это представления...вот определения представлений

CREATE VIEW [dbo].[t_entity]
(     [entity_sys_key_id]
    , [pers_flag]
    , [dob_dt]
    , [birth_plc]
    , [sin]
    , [hsn]
    , [drv_lcnc_num]
    , [ap_vndr_num]
    , [ar_cstmr_num]
    , [sec_grp_sys_key_id]
    , [actv_flag]
    , [log_eff_dt]
    , [log_can_dt]
    , [log_upd_by]
    , [sys_del_flag]
    , [sys_ts] 
)
AS
SELECT 
      [entity_sys_key_id]
    , [pers_flag]
    , [dob_dt]
    , [birth_plc]
    , [sin]
    , [hsn]
    , [drv_lcnc_num]
    , [ap_vndr_num]
    , [ar_cstmr_num]
    , [sec_grp_sys_key_id]
    , [actv_flag]
    , [log_eff_dt]
    , [log_can_dt]
    , [log_upd_by]
    , [sys_del_flag]
    , [sys_ts] 
FROM [CMN_DEV].[dbo].[t_entity]

CREATE VIEW [dbo].[t_entity_nm] 
(
      [entity_nm_sys_key_id]
    , [entity_sys_key_id]
    , [entity_nm_typ_cd]
    , [saltn_cd]
    , [frst_nm]
    , [mid_nm]
    , [last_nm]
    , [firm_nm]
    , [nysiis_key]
    , [prmy_flag]
    , [sec_grp_sys_key_id]
    , [log_eff_dt]
    , [log_can_dt]
    , [log_upd_by]
    , [sys_del_flag]
    , [sys_ts] 
)
AS 
SELECT 
      [entity_nm_sys_key_id]
    , [entity_sys_key_id]
    , [entity_nm_typ_cd]
    , [saltn_cd]
    , [frst_nm]
    , [mid_nm]
    , [last_nm]
    , [firm_nm]
    , [nysiis_key]
    , [prmy_flag]
    , [sec_grp_sys_key_id]
    , [log_eff_dt]
    , [log_can_dt]
    , [log_upd_by]
    , [sys_del_flag]
    , [sys_ts] 
FROM [CMN_DEV].[dbo].[t_entity_nm]

Контроллер Breeze выглядит следующим образом:

namespace MarketingPromotions.Controllers
{
    [BreezeController(MaxAnyAllExpressionDepth = 2)]
    public class BreezeController : ApiController
    {

    readonly EFContextProvider<OASIS_DEVEntities> _contextProvider =
            new EFContextProvider<OASIS_DEVEntities>();

        [HttpGet]
        public string Metadata()
        {
            return _contextProvider.Metadata();
        }
        #endregion

        [HttpGet]
        public IQueryable<t_entity> Entities()
        {
            return _contextProvider.Context.t_entity;
        }

        [HttpGet]
        public IQueryable<t_entity_nm> EntityNames()
        {
            return _contextProvider.Context.t_entity_nm;
        }
}

Код, где он ломается, находится в breeze.debug.js в строке ->

if (entityType.isAnonymous) return;

где «это» — поле frst_nm в следующем фрагменте кода из breeze.debug.js:

proto._validate = function(entityType) {
        // will throw if not found;
        if (this.isValidated) return;            
        this.isValidated = true;
        if (this.propertyPath) {
            if (entityType.isAnonymous) return;
            var prop = entityType.getProperty(this.propertyPath, true);
            if (!prop) {
                var msg = __formatString("Unable to resolve propertyPath.  EntityType: '%1'   PropertyPath: '%2'", entityType.name, this.propertyPath);
                throw new Error(msg);
            }
            if (prop.isDataProperty) {
                this.dataType = prop.dataType;
            } else {
                this.dataType = prop.entityType;
            }
        } else if (this.fnNodes) {
            this.fnNodes.forEach(function(node) {
                node._validate(entityType);
            });
        }
    };

person user3461612    schedule 26.03.2014    source источник
comment
Вы пытались выполнить свой запрос (как его следует перевести) непосредственно против EF, чтобы определить, работает ли сам запрос.   -  person Jay Traband    schedule 26.03.2014
comment
Я попробовал это по вашему предложению, и это сработало [HttpGet] запрос = запрос. Включить (t_entity_nm); return query.Where(e =› e.t_entity_nm.Any(en =› en.frst_nm.StartsWith(Frank))); } а затем я увидел ваш другой комментарий о сопоставлении имени ресурса/типа объекта, и это исправило его.   -  person user3461612    schedule 27.03.2014
comment
Можете пометить вопрос как отвеченный? (поэтому я могу вычеркнуть это из своего списка :)   -  person Jay Traband    schedule 27.03.2014
comment
Да, большое спасибо за оперативную помощь! Я просто готовил комментарий, чтобы поставить под реальный ответ.   -  person user3461612    schedule 27.03.2014


Ответы (1)


Это похоже на проблему с именем ресурса. Я предполагаю, что вы не установили сопоставление имени ресурса/типа объекта.

Взгляните на эти ссылки:

http://www.breezejs.com/documentation/query-result-debugging

http://www.breezejs.com/sites/all/apidocs/classes/MetadataStore.html#method_setEntityTypeForResourceName

и этот: http://www.breezejs.com/documentation/querying-locally в подтеме: Имена ресурсов не являются именами EntityType

person Jay Traband    schedule 26.03.2014
comment
Имена ресурсов не являются именами EntityType, это была именно моя проблема. Ресурс в моем случае — Entities, а EntityType — t_entity. Когда я добавляю toType («t_entity») в запрос, он работает var query = EntityQuery.from(Entities).toType(t_entity) .where(whereClause) .expand(t_entity_nm) ; Я собираюсь установить тип объекта в хранилище метаданных var metadataStore = manager.metadataStore; metadataStore.setEntityTypeForResourceName('Динамики', 'Человек'); в моем случае metadataStore.setEntityTypeForResourceName('Entities', 't_entity'); Спасибо! - person user3461612; 27.03.2014
comment
В итоге я создал функцию function mapEntityTypesToResourceNames() { var store = datacontext.manager.metadataStore; store.setEntityTypeForResourceName('Entities', 't_entity'); }, которую я вызываю в shell.js (я использую горячее полотенце с дюрандалем) в методе загрузки, который вызывается после того, как обещание primeData возвращается в методе активации.function activate() { return datacontext.primeData() .then(boot) .fail(failedInitialization); return boot(); } - person user3461612; 27.03.2014
comment
Мы решили сделать это стандартным вариантом. Вы можете проголосовать за это на User Voice - person Ward; 28.03.2014