Что делать в Dynamics365 web api, если свойство объекта не существует?

Предположим, у нас есть сущность «Учетная запись» в Dynamics 365, у учетной записи есть атрибуты номера и имени c5.

Теперь я хочу создать новую учетную запись через Dynamics 365 Web API. Я создаю объект учетной записи с номером c5, именем и добавляю дополнительный атрибут lastname. Когда я отправляю этот объект учетной записи в веб-API, я получаю сообщение об ошибке:

    "code":"","message":"The property 'lastname' does not exist on type 'Microsoft.Dynamics.CRM.account'. Make sure to only use property names that are defined by the type.","innererror":{

  "message":"The property 'lastname' does not exist on type 'Microsoft.Dynamics.CRM.account'. Make sure to only use property names that are defined by the ...

Я действительно не понимаю, почему Dynamics 365 Web API просто не может игнорировать свойство, которое он не может использовать?

В этом конкретном сценарии это означает, что если мы удалим свойство name в сущности учетной записи, есть вероятность, что все наши системы, которые взаимодействуют с веб-API, выйдут из строя.

Как я могу обойти эту проблему? Есть ли способ заставить Dynamics 365 Web API игнорировать некоторые свойства?


person Timsen    schedule 03.07.2017    source источник
comment
Вам придется согласиться с тем, что в конце приложение должно будет попытаться вставить в запрошенный столбец базы данных - ожидается, что это не удастся для несуществующего столбца. Что касается удаления: это будет только в случае с настраиваемыми атрибутами - вы не можете удалить стандартные / управляемые атрибуты.   -  person Filburt    schedule 03.07.2017
comment
Интересно, могли бы вы использовать службу MetaData, чтобы узнать атрибуты данной сущности во время выполнения, а затем отфильтровать свой POST, чтобы включить только те атрибуты, которые предоставлены в экземпляре, к которому вы подключены. Похоже на вероятный кандидат, учитывая описание в MSDN - msdn.microsoft.com /en-us/library/mt607522.aspx#Retrieving атрибуты Некоторые SO-ответы показывают, как это сделать тоже.   -  person Mr Moose    schedule 03.07.2017
comment
Если получение метаданных объекта требует слишком больших накладных расходов, вы можете создать запись по умолчанию со всеми (необходимыми) атрибутами и получить эту запись с помощью new ColumnSet(true) (SELECT * FROM), что даст экземпляр объекта со всеми допустимыми атрибутами. Сбросьте его ID на ноль, обновите атрибуты по мере необходимости и .Create() его. Используйте на свой страх и риск. Я по-прежнему рекомендую выбирать атрибуты на основе сущности (логического имени) и / или метаданных сущности.   -  person Filburt    schedule 03.07.2017
comment
Я сомневаюсь, что многие системы автоматически игнорируют операции, нацеленные на несуществующие объекты. Если они сделают это молча, это может открыть дверь для многих других проблем. В любом случае, возможно, оберните свой код в блок try / catch и цикл исключений, пока вы не удалите все свойства, которые не существуют в целевой системе.   -  person Aron    schedule 19.07.2017


Ответы (1)


Web Api не только не игнорирует неиспользуемые значения, но даже при обновлении обновляет все отправленные вами значения, даже если они равны. Поскольку один шаг может быть - проигнорируйте это значение, установив для него значение nonSerialized, оно будет исключено. Кроме того, вы можете определить именование членов класса, поэтому вам не нужно беспокоиться о том, как они называются в коде.

`[Serializable]
public class Account    {
    [NonSerialized]
    public string lastname;

    [JsonProperty("firstname")]
    public string firstName;

    [JsonProperty("index")]
    public int c5;
}
person raichiks    schedule 19.07.2017