C# вызов действия одата с набором сложных типов завершается неудачно
Кто-нибудь знает об обходном пути? Мне нужно из кода C# вызвать сервер, который выставляет действие. Это действие имеет либо строку и коллекцию сложных типов, либо сложный тип со строкой и коллекцией сложных типов в качестве параметров. Я могу получить и то и другое, но мне нужен один из двух, так как мне нужно назвать его со значительным количеством сложных типов.
Метаданные есть: либо:
<Action Name="BulkChange" IsBound="true">
<Parameter Name="bindingParameter" Type="Collection(PropertyCore.InspectionDuty)"/>
<Parameter Name="Comment" Type="Edm.String" Unicode="false"/>
<Parameter Name="Changes" Type="Collection(PropertyCore.InspectionDutyChange)"/>
</Action>
Со следующим сложным типом:
<ComplexType Name="InspectionDutyChange">
<Property Name="Operation" Type="Operations.Operations" Nullable="false"/>
<Property Name="Identity" Type="Edm.Guid" Nullable="false"/>
<Property Name="IsDisabled" Type="Edm.Boolean" Nullable="false"/>
<Property Name="SeriesStart" Type="Edm.DateTimeOffset"/>
<Property Name="Interval" Type="Common.Interval"/>
<NavigationProperty Name="Module" Type="PropertyCore.Module"/>
<NavigationProperty Name="Equipment" Type="PropertyCore.Equipment"/>
<NavigationProperty Name="OperatorTask" Type="PropertyCore.OperatorTask"/>
</ComplexType>
ИЛИ, альтернативно:
<Action Name="BulkChange" IsBound="true">
<Parameter Name="bindingParameter" Type="Collection(PropertyCore.InspectionDuty)"/>
<Parameter Name="Updates" Type="PropertyCore.InspectionDutyChanges"/>
</Action>
со сложными типами, определенными как
<ComplexType Name="InspectionDutyChanges">
<Property Name="Comment" Type="Edm.String"/>
<Property Name="Changes" Type="Collection(PropertyCore.InspectionDutyChange)"/>
</ComplexType>
<ComplexType Name="InspectionDutyChange">
<Property Name="Operation" Type="Operations.Operations" Nullable="false"/>
<Property Name="Identity" Type="Edm.Guid" Nullable="false"/>
<Property Name="IsDisabled" Type="Edm.Boolean" Nullable="false"/>
<Property Name="SeriesStart" Type="Edm.DateTimeOffset"/>
<Property Name="Interval" Type="Common.Interval"/>
<NavigationProperty Name="Module" Type="PropertyCore.Module"/>
<NavigationProperty Name="Equipment" Type="PropertyCore.Equipment"/>
<NavigationProperty Name="OperatorTask" Type="PropertyCore.OperatorTask"/>
</ComplexType>
Я не вижу способа обойти это, поскольку мы должны поддерживать несколько обновлений за один прогон.
Исключения - все, что я могу сказать о серьезных недостатках в odata.net.
Первый вариант:
Microsoft.OData.ODataException: Unsupported primitive type. A primitive type could not be determined for an instance of type 'Api.Odata.InspectionDutyChange'.
Result StackTrace:
at Microsoft.OData.ValidationUtils.ValidateIsExpectedPrimitiveType(Object value, IEdmPrimitiveTypeReference valuePrimitiveTypeReference, IEdmTypeReference expectedTypeReference)
at Microsoft.OData.JsonLight.ODataJsonLightValueSerializer.WritePrimitiveValue(Object value, IEdmTypeReference actualTypeReference, IEdmTypeReference expectedTypeReference)
at Microsoft.OData.JsonLight.ODataJsonLightCollectionWriter.WriteCollectionItem(Object item, IEdmTypeReference expectedItemType)
at Microsoft.OData.ODataCollectionWriterCore.InterceptException(Action action)
at Microsoft.OData.TaskUtils.GetTaskForSynchronousOperation(Action synchronousOperation)
--- End of stack trace from previous location where exception was thrown ---
и второй вариант:
Microsoft.OData.ODataException: The parameter 'Updates' is of Edm type kind 'Complex'. You cannot call WriteValue on a parameter that is not of Edm type kinds 'Primitive', 'Enum' or 'Complex'.
Stack trace:
Result StackTrace:
at Microsoft.OData.ODataParameterWriterCore.VerifyCanWriteValueParameter(Boolean synchronousCall, String parameterName, Object parameterValue)
at Microsoft.OData.ODataParameterWriterCore.WriteValueAsync(String parameterName, Object parameterValue)
Я могу сделать обходной путь для одного обновления - но это вообще непригодно для использования.
Кто-нибудь есть идеи, как обойти это ограничение? Мы используем Simple.Odata.Client в качестве клиента, но здесь это не проблема - трассировка стека указывает на ограничения (при отсутствии модульных тестов) в стеке Odata.Net. Который также не спешит делать обновления. Без альтернатив мне придется вручную создать http-запрос для этих вызовов.
Обновление: обходного пути нет. Похоже, что до тех пор, пока это не будет исправлено в библиотеках odata.net, мы будем придерживаться стандартного API REST и вручную создавать выплаты. КАЖДЫЙ тип compelx терпит неудачу, и я не могу разложить последний уровень, так как он содержит свойства навигации - и я не могу перекомпоновать ссылки (что я должен уже сделать, используя собственный десериализатор, потому что это еще один не поддерживаемый сценарий в odata.net). Таким образом, если у кого-то нет обходного пути, это действие совместимо с odata, но несовместимо с odata.net.
0 ответов
Я предполагаю, что вы используете Simple.Odata.client
. Эта библиотека не обновлялась с тех пор, как в ядре OData было внесено изменение, чтобы рассматривать сложные типы так же, как типы сущностей, потому что сложные типы имеют свойства навигации так же, как типы сущностей. Описание изменения можно найти здесь:ODataComplexValue. Эта проблема также была решена в проблеме GitHub:средство записи коллекции сложных типов. Поэтому я бы посоветовал вам использоватьMicrosoft.OData.Client
который актуален и работает.