0

Я пытаюсь загрузить объект на основе запроса и разрешить пользователю его редактировать. Объект загружается без проблем из запроса, однако он не загружает связанные с ним объекты, оставляя сборщики деталей незаполненными при загрузке экрана редактирования.Получение ярлыка HTML-клиента для загрузки связанных объектов

Это код, который у меня есть:

myapp.BrowseCOAMissingHoldingCompanies.VW_ChartOfAccountsWithMissingHoldingCompanies_ItemTap_execute = function (screen) { 
     var accountName = screen.VW_ChartOfAccountsWithMissingHoldingCompanies.selectedItem.AccountFullName; 
     return myapp.activeDataWorkspace.Accounting360Data.FindChartOfAccountsMappingByAccountName(accountName) 
      .execute().then(function (query) { 
      var coa = query.results[0]; 
      return myapp.showAddEditChartOfAccountsMapping(coa, { 
       beforeShown: function (addEditScreen) { 
        addEditScreen.ChartOfAccountsMapping = coa; 

       }, 
       afterClosed: function() { 
        screen.VW_ChartOfAccountsWithMissingHoldingCompanies.refresh(); 
       } 
      }); 
    }); 
}; 

Интересно, если я открываю экран обзора (и ничего больше) этого типа объекта первого (который не получить объект), то соответствующие объекты правильно загрузить и все работает, но я не могу понять, как сделать этот уровень нагрузки в этом коде.

+0

У вас есть доступ к определению 'FindChartOfAccountsMappingByAccountName'? –

+0

В lightwitch все, что вы можете получить, это скриншот, к сожалению. Он не делает ничего интересного, кроме принятия одного параметра и возврата единственного результата. – Yishai

ответ

0

Entity Framework по умолчанию использует ленивую загрузку, поэтому связанные данные будут загружаться по требованию, но в вашем случае это слишком поздно, потому что объект уже является клиентской стороной этой точки.

Попробуйте использовать Include method в вашем запросе, если вы хотите с нетерпением загружать.

+0

Спасибо, к сожалению, в Lightswitch у вас нет контроля над тем, как он вызывает инфраструктуру сущности. – Yishai

0

Вызов обновления на детали объекта, кажется, сделать это:

 return coa.details.refresh().then(function() { 
      return myapp.showAddEditChartOfAccountsMapping(coa, { 
       beforeShown: function (addEditScreen) { 
        addEditScreen.ChartOfAccountsMapping = coa; 

       }, 
       afterClosed: function() { 
        screen.VW_ChartOfAccountsWithMissingHoldingCompanies.refresh(); 
       } 
      }); 
     }); 
0

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

1

Один из способов борьбы с этим (и избежать дополнительного выполнения запроса следящей на обновления), чтобы использовать метод расширения, чтобы включать любые дополнительные навигационные свойства следующим образом:

myapp.BrowseCOAMissingHoldingCompanies.VW_ChartOfAccountsWithMissingHoldingCompanies_ItemTap_execute = function (screen) { 
    var accountName = screen.VW_ChartOfAccountsWithMissingHoldingCompanies.selectedItem.AccountFullName; 
    return myapp.activeDataWorkspace.Accounting360Data.FindChartOfAccountsMappingByAccountName(
     accountName 
    ).expand(
     "RelatedEntity," + 
     "AnotherRelatedEntity," + 
     "AnotherRelatedEntity/SubEntity" 
    ).execute().then(function (query) { 
     var coa = query.results[0]; 
     return myapp.showAddEditChartOfAccountsMapping(coa, { 
      beforeShown: function (addEditScreen) { 
       addEditScreen.ChartOfAccountsMapping = coa; 
      }, 
      afterClosed: function() { 
       screen.VW_ChartOfAccountsWithMissingHoldingCompanies.refresh(); 
      } 
     }); 
    }); 
} 

Как вы еще не упомянутое имя навигационных свойств вашего объекта, я использовал coa.RelatedEntity, coAAnotherRelatedEntity и coAnotherRelatedEntity.SubEntity в приведенном выше примере.

Этот метод распространяется по методу LightSwitch intellisense (в msls -?.?.? - vsdoc.js). Он расширяет результаты путем включения дополнительных свойств навигации с использованием выражения, определяемого опцией системного запроса OData $ expand, и он принимает единственный параметр «Расширение выражения OData (список имен навигационных свойств, разделенных запятыми)».

Причина, по которой принудительное обновление coa также заполняет навигационные свойства, заключается в том, что метод обновления LightSwitch неявно расширяет все свойства навигации (при условии, что вы не укажете параметр navigationPropertyNames при вызове обновления). Ниже показана внутренняя реализация методы LightSwitch обновления (с неявным расширением поведения исполняющего если параметр navigationPropertyNames равно нуль):

function refresh(navigationPropertyNames) { 

    var details = this, 
     properties = details.properties.all(), 
     i, l = properties.length, 
     property, 
     propertyEntry, 
     query; 

    if (details.entityState !== _EntityState.unchanged) { 
     return WinJS.Promise.as(); 
    } 

    if (!navigationPropertyNames) { 
     navigationPropertyNames = []; 
     for (i = 0; i < l; i++) { 
      property = properties[i]; 
      propertyEntry = property._entry; 
      if (isReferenceNavigationProperty(propertyEntry) && 
       !isVirtualNavigationProperty(propertyEntry)) { 
       navigationPropertyNames.push(propertyEntry.serviceName); 
      } 
     } 
    } 

    query = new _DataServiceQuery(
     { 
      _entitySet: details.entitySet 
     }, 
     details._.__metadata.uri); 
    if (navigationPropertyNames.length > 0) { 
     query = query.expand(navigationPropertyNames.join(",")); 
    } 

    return query.merge(msls.MergeOption.unchangedOnly).execute(); 
} 

Однако, если принять подход обновления, вы будете выполнять дополнительную ненужный операции запроса.