【发布时间】: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