首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Simple.OData.Client仅更新某些属性

使用Simple.OData.Client仅更新某些属性
EN

Stack Overflow用户
提问于 2018-11-29 17:44:59
回答 3查看 1.5K关注 0票数 1

我正在使用Simple.OData.Client,并且我想要更新实体的某些属性。

假设我在C#中有以下类:

代码语言:javascript
复制
[DataContract(Name = "entity")]
public class MyEntity
{
        [DataMember(Name = "propertyA")]
        public string MyPropertyA { get; set; }

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

我尝试这样更新propertyA:

代码语言:javascript
复制
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补丁?

EN

回答 3

Stack Overflow用户

发布于 2021-07-26 00:24:16

你应该使用PATCH而不是PUT。

HTTP Standard说:

给定表示的成功PUT将意味着在相同目标资源上的后续GET将导致在200 (OK)响应中发送等效的表示。

因此,如果您发出的PUT请求中只包含MyPropertyA,那么后续的GET应该返回一个MyPropertyBnull的实体。

首先,OData v4 Standard说:

支持PUT的

服务必须将结构属性的所有值替换为请求正文中指定的值。在引用约束中,未定义为依赖属性的缺少的非键、可更新结构属性必须设置为其默认值

虽然您可以让客户端不发送MyPropertyB,但正确的OData服务器必须将其解释为将该值设置为默认 (null)的请求。

票数 1
EN

Stack Overflow用户

发布于 2018-11-29 17:48:01

您应该使用匿名对象来完成此操作,或者找到某种方法来配置客户端的序列化程序,使其忽略缺省值(例如,ref类型为null )。

代码语言:javascript
复制
await _simpleOdataClient.For<MyEntity>()
                  .Key(key)
                  .Set(new
                  {
                    MyPropertyA = "test"
                  })
                  .UpdateEntryAsync();
票数 0
EN

Stack Overflow用户

发布于 2019-10-14 14:49:24

您可以使用类型化的fluent API来实现这一点。

您必须显式地选择用于读取(.Select)的字段,并在写入(.Set)时显式地设置它们,以防止发送整个结构。

我想你就快到了..不使用.Set(新的MyEntity ),而使用.Set(新的.

我还使用了填充的实体实例和简化的.Set

代码语言:javascript
复制
              .Set(new 
              {
                myEntity.MyPropertyA,
              })

等同于

代码语言:javascript
复制
              .Set(new 
              {
                MyPropertyA = myEntity.MyPropertyA,
              })

总而言之,这应该是可行的。除非DataContract以某种方式引起了问题。在我的工作示例中,类没有DataContract属性。用Fiddler验证是否只发送指定的字段(在我的代码中)。

代码语言:javascript
复制
 var myEntity = new MyEntity() 
 {
    MyPropertyA = "test"
 };

 await _simpleOdataClient.For<MyEntity>()
              .Key(key)
              .Set(new 
              {
                myEntity.MyPropertyA,
              })
              .UpdateEntryAsync();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53536016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档