微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OData 新实体但部分有效负载

如何解决OData 新实体但部分有效负载

我正在尝试使用此 VS 扩展 this VS extension(这似乎是推荐的方式)从 C# 访问 OData。它在项目内生成一个 Connected 服务,以访问(在我的例子中)一个 Business Central API。

当我创建一个对象(这里是一个供应商)时,通过这种代码

var context = new BCNS.NAV(new Uri(_serviceRoot));
var vendor = vendor.Createvendor(Guid.NewGuid());
context.AddTovendors(vendor);
context.SaveChanges();

它失败了,因为 vendore 的 2 个属性是只读的;上下文发送序列化 json 中的每个属性,但它失败了。 (如果我手动删除它们会成功)

这两个属性在 $Metadata 中看起来没有什么不同:

<Property Name="balance" Type="Edm.Decimal" Scale="Variable" /> 
<Property Name="lastModifiedDateTime" Type="Edm.DateTimeOffset" />

不要知道它怎么会猜到它们是只读的。

我已经看到 here 如何在更新请求期间发送部分有效负载,并且我正在拼命尝试为创作制作类似的东西。

我看到 context.SaveChanges 有一个可能的参数“PostOnlySetProperties”,它“只能在使用 DataServiceCollection 时使用”,但我尝试通过它添加对象失败。它似乎只处理它正在跟踪的对象,而不是新对象。

有人知道如何在创建新项目时发送部分负载吗?

提前致谢。

解决方法

好的,找到了。

我把这个答案放在这里,因为很难找到,也许有一天它会有所帮助。

我不得不使用 DataServiceCollection,它正确初始化,也适用于新元素。新元素似乎必须在之后初始化(我猜是出于明显的跟踪原因)。 以下代码有效。

var context = CreateContext("vendors");

DataServiceCollection<Vendor> vendors = new DataServiceCollection<Vendor>(context,"Vendor",null,null);

var vendor = new Vendor();
vendors.Add(vendor);
vendor.Id = Guid.NewGuid();
vendor.DisplayName = "Attempt to create vendor 03";

context.SaveChanges(SaveChangesOptions.PostOnlySetProperties);`

然后发送部分有效载荷。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。