【问题标题】:OData new entity but partial payloadOData 新实体但部分有效负载
【发布时间】:2021-07-12 10:17:55
【问题描述】:

我正在尝试使用此 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 中的每个属性,但它失败了。 (如果我手动删除它们就成功了)

这 2 个属性在 $metadata 中看起来并没有什么不同:

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

不知道它是如何猜测它们是只读的。

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

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

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

提前致谢。

【问题讨论】:

  • 请不要个人认为,我给任何人这个建议。恕我直言,OData 在 10 年前很流行,我不知道现在有谁在使用它。因此,如果还不算太晚,请忘记 OData 并选择另一种技术
  • 您应该改为改为使用 OData Connected 服务实现。否则,您可以手动覆盖生成的代理或编辑生成类的 T4 模板。请发布与vendore 和具有只读属性的类对应的$metadata 文档片段,通常不会这么难。
  • @serge OData 在今天同样重要,也许更重要,但在这种情况下,服务器 api 正在推动需求,在这种情况下你没有很多选择,但 OP 是遵循关于实施 OData 客户端的非常陈旧且过时的指南。
  • @ChrisSchaller 我只是说没有理想的技术。否则将仅使用该技术。任何技术都有地方和 munuces。我可以假设 OData 在某些特殊情况下可以节省一些时间和金钱,但在大多数情况下,它的缺点多于优点。这只是我的拙见,也许我错了。
  • @ChrisSchaller 这两个属性是只读的(因为我看不到它们是只读的,我可以猜到为什么生成器对此什么都不做): 实际上,当我搜索“OData Connected service implementation”时,google 给了我与我给出的相同的链接为扩展。它在连接的服务中生成代码,我试图在我的代码摘录中调用它。如果有更现代的方法可以做到这一点,我愿意接受。

标签: c# odata .net-standard-2.0 dynamics-business-central


【解决方案1】:

好的,找到了。

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

我必须使用正确初始化的 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);`

然后发送部分有效负载。

【讨论】:

  • 干得好,更好的 API 不会在负载中混合只读属性,也不会在接收到数据时简单地忽略它们的值。
  • 谢谢@ChrisSchaller。很高兴我不必深入研究 Odata 客户端源来解决此问题。
猜你喜欢
  • 2013-07-17
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多