Устранить ошибку при глубокой вставке свойства навигации Dynamics WebAPI

Я использую Microsoft Dynamics Web API для записи данных в сущность в Microsoft Dynamics 365. Когда я пытаюсь выполнить глубокую вставку, я получаю сообщение об ошибке

Необъявленное свойство 'ccseq_employeeid', которое имеет только аннотации свойств в полезной нагрузке, но не обнаружило значения свойства в полезной нагрузке. В OData только объявленные свойства навигации и объявленные именованные потоки могут быть представлены как свойства без значений.

Почему я получаю эту ошибку и как ее устранить?

JSON

{
    "ccseq_importdate" : "2017-05-28T04:00:00Z", 
    "ccseq_month" : "1", 
    "ccseq_year" : "2017", 
    "ccseq_name" : "Test", 
    "ccseq_status" : "100000000", "ccseq_ccseq_expensetransactionset_ccseq_expensetransaction_ExpenseTransactionSetID" : 
    [ 
        { 
          "ccseq_employeeid@odata.bind": "/systemusers(6d2fd71b-32d1-dd11-a4f5-001a6449bbe7)", 
          "ccseq_clientid@odata.bind": "/ccseq_clients(663ebd00-73b9-4faf-90ed-f56bb9c2dc9b)", 
          "ccseq_navemployeeid" : "11111", 
          "ccseq_employeefirstname" : "John"
        }
    ]
}

ExpenseTransactionSet является родителем ExpenseTransaction означающий, что ExpenseTransaction есть поиск ExpenseTransactionSet, ccseq_ccseq_expensetransactionset_ccseq_expensetransaction_ExpenseTransactionSetID это отношения один ко многим. systemuser а также ccseq_clients отдельные объекты, которые являются поисками в ExpenseTransaction,

Я также попробовал следующие варианты на "ccseq_employeeid@odata.bind"

  • objectid_systemuser@odata.bind
  • objectid_ccseq_employeeid@odata.bind
  • ccseq_employeeid@data.bind
  • ccseq_employeeid@odata.bind : systemusers()
  • ccseq_employeeid_systemusers@odata.bind
  • systemuserid_systemusers@odata.bind

Я видел этот вопрос и этот вопрос и безуспешно пробовал предложенные решения.

2 ответа

Решение

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

{
    "ccseq_importdate" : "2017-05-28T04:00:00Z", 
    "ccseq_month" : "1", 
    "ccseq_year" : "2017", 
    "ccseq_name" : "Test", 
    "ccseq_status" : "100000000",
    "ccseq_ccseq_expensetransactionset_ccseq_expensetransaction_ExpenseTransactionSetID" : 
    [ 
        {
          // Next two lines are changed 
          "ExpenseTransaction[ccseq_employeeid@odata.bind]": "/systemusers(6d2fd71b-32d1-dd11-a4f5-001a6449bbe7)", 
          "ExpenseTransaction[ccseq_clientid@odata.bind]": "/ccseq_clients(663ebd00-73b9-4faf-90ed-f56bb9c2dc9b)", 
          "ccseq_navemployeeid" : "11111", 
          "ccseq_employeefirstname" : "John"
        }
    ]
}

В документе метаданных {org-url}/api/data/v8.0/$metadata, вы можете проверить тип элемента свойства навигации со значением коллекции ccseq_ccseq_expensetransactionset_ccseq_expensetransaction_ExpenseTransactionSetID?

Это тот же тип, который имеет ccseq_employeeid как его свойство навигации? Если нет, то и собственность ccseq_employeeid принадлежит к производному типу, вам может потребоваться аннотировать объект свойства навигации, как показано ниже:

{
    "ccseq_importdate" : "2017-05-28T04:00:00Z", 
    "ccseq_month" : "1", 
    "ccseq_year" : "2017", 
    "ccseq_name" : "Test", 
    "ccseq_status" : "100000000",
    "ccseq_ccseq_expensetransactionset_ccseq_expensetransaction_ExpenseTransactionSetID" : 
    [ 
        {
          "@odata.type": "Microsoft.Dynamics.CRM.ccseq_navemployee",
          "ccseq_employeeid@odata.bind": "/systemusers(6d2fd71b-32d1-dd11-a4f5-001a6449bbe7)", 
          "ccseq_clientid@odata.bind": "/ccseq_clients(663ebd00-73b9-4faf-90ed-f56bb9c2dc9b)", 
          "ccseq_navemployeeid" : "11111", 
          "ccseq_employeefirstname" : "John"
        }
    ]
}