![](/img/trans.png)
[英]Simple.Odata.Client - Odata Patch Entity by only sending modified properties to server
[英]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.