Расширенные свойства Breeze — как ссылаться на массивы контроллеров

Мне не хватает ключевой части понимания в моей первой попытке получить полные графики сущностей для сущности с Breeze и EF6 (вариант Hottowel/John Papa)

У меня есть отношения родитель-потомок-внук Policies-P_Locations-P_Hazards

Я хочу видеть графики по всем политикам для одного клиента

Короче говоря, мой запрос возвращает JSON в форме, которую я ожидаю (подтверждено в средстве просмотра XHR), а data.results позволяют мне детализировать (через резервное хранилище - нам нужен просмотрщик на javascript, например C #), чтобы увидеть массивы для детей и внуков . Я вижу все политики, местоположения и опасности, которые я ожидаю для клиента (версия dll и код модели/модели в конце поста)

контекст данных:

    function getPoliciesByClientsId(clientsid) {

        var policies;

        return EntityQuery.from('Policies')
            .withParameters({ clientsid: clientsid })
            .expand('P_Locations, P_Locations.P_Hazards')
            .using(manager).execute()
            .then(querySucceeded, _queryFailed);

        function querySucceeded(data) {
            policies = data.results;
            log('Retrieved [Policy] from remote data source', policies.length, true);

            return policies;
        }

    }

контроллер:

function getPoliciesByClientsId(clientsid) {

    return datacontext.getPoliciesByClientsId(clientsid).then(function(data) {
        vm.Policies = [];
        vm.Policies = data;
// at this point vm.Policies shows an object array 
// and I can see p_Locations for each policy and p_Hazards for each location
// but vm.Policies.p_locations is undefined

            return vm.Policies;
        }
    );


}

Если я углублюсь в политики в datacontext или vm.Policies в контроллере, я увижу массивы в верблюжьем корпусе.

НО

vm.Policies.p_Locations не определено. И, конечно, я также хочу сослаться на vm.Policies.p_Locations.p_Hazards.

Что мне не хватает, чтобы сослаться на график данных для привязки?

Контроллер ветра:

[HttpGet]
public IQueryable<Policy> Policies()
{
    return _repository.Policies;
}

PwiRepository

    public IQueryable<Policy> Policies
    {
        get { return Context.Policies; }
    }

И это создает этот запрос :

Request URL:http://localhost:29130/breeze/Breeze/Policies?$expand=P_Locations%2CP_Locations%2FP_Hazards&clients_id=439

Используя manager.metadataStore.getEntityType('P_Location'), а затем переходя к свойствам навигации, я нашел эти

navigationProperties: Array[4]0: 

dassociationName: "P_Hazard_P_Location"
entityType: l
entityTypeName: "P_Hazard:#Pwi.Model.Models"
foreignKeyNames: Array[0]
foreignKeyNamesOnServer: Array[0]
invForeignKeyNames: Array[1]
invForeignKeyNamesOnServer: Array[1]
inverse: disScalar: falsename: "p_Hazards"
nameOnServer: "P_Hazards"
parentType: lvalidators: Array[0]

associationName: "P_Location_Policy"
entityType: lentityTypeName: "Policy:#Pwi.Model.Models"
foreignKeyNames: Array[1]
foreignKeyNamesOnServer: Array[1]
invForeignKeyNames: Array[0]
invForeignKeyNamesOnServer: Array[0]
inverse: disScalar: truename: "policy"
nameOnServer: "Policy"parentType: l
relatedDataProperties: Array[1]validators: Array[0]__proto__: Objectlength: 4

Вот куски dll

<packages>
  <package id="Breeze.Server.ContextProvider" version="1.4.17" targetFramework="net45" />
  <package id="Breeze.Server.ContextProvider.EF6" version="1.4.17" targetFramework="net45" />
  <package id="Breeze.Server.WebApi2" version="1.4.17" targetFramework="net45" />
  <package id="EntityFramework" version="6.1.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.OData" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.Data.Edm" version="5.6.2" targetFramework="net45" />
  <package id="Microsoft.Data.OData" version="5.6.2" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="6.0.4.0" targetFramework="net45" />
  <package id="System.Spatial" version="5.6.2" targetFramework="net45" />
  <package id="WebActivator" version="1.5.3" targetFramework="net45" />
</packages>

У меня есть отношение родитель-потомок-внук Policies-P_Locations-P_Hazards Вот соответствующие части модели и отображения модели

Модель P_Location:

public partial class P_Location
    {
        public P_Location()   
        {
            this.P_GlCoverages = new List<P_GlCoverage>();
            this.P_Hazards = new List<P_Hazard>();
            this.P_PropertyCoverages = new List<P_PropertyCoverage>();
        }
        public int P_Locations_id { get; set; }
        public int Policies_id { get; set; }
      ......

      public virtual Policy Policy { get; set; }
      public virtual ICollection<P_Hazard> P_Hazards { get; set; }

P_LocationMap

 // Relationships
            this.HasRequired(t => t.Policy)
                .WithMany(t => t.P_Locations)
                .HasForeignKey(d => d.Policies_id);

Модель P_Hazard

public Policy Policy { get; set; }
        public P_Location P_Location { get; set; }

P_HazardMap

  // Relationships
            this.HasRequired(t => t.P_Location)
                .WithMany(t => t.P_Hazards)
                .HasForeignKey(d => d.P_Locations_id);

person Charles Hankey    schedule 01.09.2014    source источник


Ответы (1)


Во-первых, я бы проверил, чтобы объекты, возвращаемые вашим запросом, на самом деле были сущностями. есть ли у каждого из них свойство "entityAspect"? Если нет, вы возвращаете проекции вместо объектов. Это может произойти по разным причинам, но обычно это связано либо с проблемой namingConvention, либо с отсутствием вызова toType в вашем EntityQuery. (необходим, если конечная точка запроса не находится в карте типа объекта/имени ресурса, что часто бывает с параметризованными запросами).

Я бы также заглянул в MetadataStore с помощью getEntityType и убедился, что имена свойств для каждой из ваших сущностей соответствуют вашим ожиданиям.

Можете ли вы также опубликовать запрос на стороне сервера?

person Jay Traband    schedule 01.09.2014
comment
Кажется, что каждая сущность во внучке имеет свойство entityAspect. Если я углублюсь в p_Locations entityAspect.entityManager, я увижу хранилище метаданных: i _ctorRegistry: Object _deferredTypes: Object _entityTypeResourceMap: Object ... P_Hazard:#Pwi.Model.Models: P_Hazards P_Location:#Pwi.Model.Models: P_Locations ... Policy: #Pwi.Model.Models: Политики proto: Объект, который представляет собой модели, которые я ожидаю. Публикация кода на стороне сервера выше в исходном вопросе. - person Charles Hankey; 01.09.2014
comment
Я не уверен, что меня это действительно волнует, но может ли кто-нибудь сказать мне, кто проголосовал против этого вопроса и почему? Я думал, что это подробно объяснило проблему и напрямую ответило на просьбу Джея опубликовать дополнительную информацию. - person Charles Hankey; 01.09.2014
comment
Хорошо, перечитывая ваш пост, я не уверен, что понимаю, когда вы говорите, что видите все политики, местоположения и опасности, но Policies.p_Locations не определено. Как вы можете иметь оба? Где вы видите правила, места и опасности? Кроме того, вы должны обращаться к свойству data.results в обещании then, а не только к данным. - person Jay Traband; 01.09.2014
comment
Не знаю, кто вас понизил, но я только что забил обратно. - person Jay Traband; 01.09.2014
comment
Спасибо, Джей. Я имел в виду, что в JSON я вижу все ожидаемые данные, а в data.results в контексте данных я могу детализировать политики и видеть массив p_Locations, а затем углубляться в каждое p_Location, чтобы увидеть массив p_Hazards. Я вижу это, сверяясь с _backingstore в каждом случае. То же самое для детализации vm.Policies, которые получили данные в контроллере. Я ожидал, что vm.Policies.p_Locations будет привязываемым массивом. Нужно ли где-то явно объявлять vm.Policies.p_Locations = []? - person Charles Hankey; 02.09.2014
comment
Следует добавить неопределенный результат в окне просмотра (Chrome) и в консоли в соответствующей области. - person Charles Hankey; 02.09.2014
comment
Не уверен, что вы подразумеваете под привязываемым массивом. Если вы используете библиотеку моделей backingStore, вы, вероятно, используете Angular, и Angular привязывается напрямую к любому объекту js. - person Jay Traband; 02.09.2014
comment
если политики являются массивом, то каждая политика будет иметь свойство p_Locations, а сам массив политик — нет. то есть vm.Policies[0].p_Locations будет существовать, но vs.Policies.p_Locations не будет существовать и не ожидается. Breeze просто строит граф отношений, которые вы запрашиваете. - person Jay Traband; 02.09.2014