繁体   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