簡體   English   中英

具有復雜類型集合的 C# odata 操作失敗

[英]C# odata action with complex type collection fails

我需要調用一個公開操作的服務器。 此操作具有復雜類型集合的字符串或復雜類型集合作為參數。 我也需要打電話。

元數據是:

任何一個:

<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)

我可以為一次更新制定一種解決方法 - 但這通常不可用。

我們使用 Odata 客戶端,但這不是客戶端的問題。 堆棧跟蹤指向 Odata.Net 堆棧中的限制。 更新也很慢。 替代方案 我必須手動為這些調用創建 HTTP 請求。

更新:沒有解決方法。 看起來,在 Odata.Net 庫中解決此問題之前,我們必須堅持使用標准的 REST API 並手動構建有效負載。 每個復雜類型都失敗了,我無法分解最后一個級別,因為它包含導航屬性。 我無法重組參考文獻。 我已經在使用自定義解串器,因為這是 Odata.Net 中另一個不受支持的場景。 除非有人有解決方法,否則此操作與 Odata 兼容,但 Odata.net 不兼容。

我假設您正在使用Simple.Odata.client 自從在 OData 核心中進行更改以將復雜類型視為與實體類型相同以來,此庫尚未更新,因為復雜類型具有與實體類型一樣的導航屬性。 可以在此處找到更改說明: ODataComplexValue該問題也已在 GitHub 問題中解決:復雜類型集合編寫器 因此,我建議您使用最新且有效的Microsoft.OData.Client

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM