簡體   English   中英

使用 Simple.OData.Client 僅更新某些屬性

[英]Update only certain properties with Simple.OData.Client

我正在使用 Simple.OData.Client 並且我想更新實體的某些屬性。

假設我在 C# 中有以下課程:

[DataContract(Name = "entity")]
public class MyEntity
{
        [DataMember(Name = "propertyA")]
        public string MyPropertyA { get; set; }

        [DataMember(Name = "propertyB")]
        public string MyPropertyB { get; set; }
}

我正在嘗試像這樣更新 propertyA:

await _simpleOdataClient.For<MyEntity>()
                  .Key(key)
                  .Set(new MyEntity
                  {
                    MyPropertyA = "test"
                  })
                  .UpdateEntryAsync();

我以此為例: https : //github.com/object/Simple.OData.Client/wiki/Updating-entries

我的問題是發送一個帶有 propertyA=test 但 propertyB=null 的 PUT 請求。 它嘗試為我不想更改的屬性設置空值。

是否可以僅更新某些屬性並在 OData 請求中發送 HTTP PATCH?

您應該使用 PATCH 而不是 PUT。

HTTP 標准說:

給定表示的成功 PUT 將表明對同一目標資源的后續 GET 將導致在 200 (OK) 響應中發送等效表示。

因此,如果您在請求中發出一個僅包含MyPropertyA的 PUT,那么后續的 GET 應該返回一個帶有MyPropertyB的實體為null

OData v4 標准主要說:

支持 PUT 的服務必須用請求正文中指定的值替換結構屬性的所有值。 缺少未定義為引用約束內的依賴屬性的非關鍵、可更新結構屬性必須設置為其默認值

雖然您可以讓客戶端不發送MyPropertyB ,但適當的 OData 服務器必須將其解釋為將值設置為默認值(null) 的請求。

您應該使用匿名對象來執行此操作,或者找到某種方法來配置客戶端的序列化程序以忽略默認值(例如,引用類型為 null)。

await _simpleOdataClient.For<MyEntity>()
                  .Key(key)
                  .Set(new
                  {
                    MyPropertyA = "test"
                  })
                  .UpdateEntryAsync();

您可以使用類型化的 fluent API 來實現這一點。

您必須為讀取 (.Select) 顯式選擇字段,並在寫入時顯式設置它們。 (.Set) 以防止發送整個結構。

我想你快到了.. 而不是.Set(new MyEntity use .Set(new .

我還使用填充的實體實例和簡化的 .Set

              .Set(new 
              {
                myEntity.MyPropertyA,
              })

相當於

              .Set(new 
              {
                MyPropertyA = myEntity.MyPropertyA,
              })

一切都那么這應該工作。 除非 DataContract 以某種方式導致問題。 在我的工作示例中,該類沒有 DataContract 屬性。 使用 Fiddler 驗證僅發送指定的字段(在我的代碼中)。

 var myEntity = new MyEntity() 
 {
    MyPropertyA = "test"
 };

 await _simpleOdataClient.For<MyEntity>()
              .Key(key)
              .Set(new 
              {
                myEntity.MyPropertyA,
              })
              .UpdateEntryAsync();

暫無
暫無

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

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