我正在使用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补丁?
发布于 2021-07-26 00:24:16
你应该使用PATCH而不是PUT。
给定表示的成功PUT将意味着在相同目标资源上的后续GET将导致在200 (OK)响应中发送等效的表示。
因此,如果您发出的PUT请求中只包含MyPropertyA,那么后续的GET应该返回一个MyPropertyB为null的实体。
首先,OData v4 Standard说:
支持PUT的
服务必须将结构属性的所有值替换为请求正文中指定的值。在引用约束中,未定义为依赖属性的缺少的非键、可更新结构属性必须设置为其默认值。
虽然您可以让客户端不发送MyPropertyB,但正确的OData服务器必须将其解释为将该值设置为默认 (null)的请求。
发布于 2018-11-29 17:48:01
您应该使用匿名对象来完成此操作,或者找到某种方法来配置客户端的序列化程序,使其忽略缺省值(例如,ref类型为null )。
await _simpleOdataClient.For<MyEntity>()
.Key(key)
.Set(new
{
MyPropertyA = "test"
})
.UpdateEntryAsync();发布于 2019-10-14 14:49:24
您可以使用类型化的fluent API来实现这一点。
您必须显式地选择用于读取(.Select)的字段,并在写入(.Set)时显式地设置它们,以防止发送整个结构。
我想你就快到了..不使用.Set(新的MyEntity ),而使用.Set(新的.
我还使用了填充的实体实例和简化的.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();https://stackoverflow.com/questions/53536016
复制相似问题