如何使用 GraphQL 突变进行更新(热巧克力)

How to do updates with GraphQL mutations(Hot Chocolate)

我们最近在我们的项目中引入了 GraphQL,我以前从未使用过它,但我非常喜欢它。 我们决定为 .NET Core 使用 HotChocolate 库,为客户端使用 Apollo。

我不太确定的一件事是关于突变,特别是执行更新和带有突变的部分更新。 我在某处读到这种做法,我应该坚持 为每个更新创建特定的突变 ,例如 updateUsername()、updateAddress()、updateCity() 所有这些都应该有特定的突变.

问题是,如果我决定朝那个方向前进,我的代码库将大幅增长,因为我们非常依赖数据,每个 table 有很多 table 和列.

另一个问题是,如何处理可为空的属性,我可以创建一个接受某些输入对象的突变,但最终我的实体将被覆盖,并且调用端未提供的所有可为空的属性都将被设置为空。 有没有办法部分处理此更新,或者我应该为我想要更新的每个 属性 进行特定的更新突变?

我认为您对特定突变的最佳实践理解有误。它不是“有一个突变来更新一个字段”,而是更多的是“有特定的突变来封装你的域中的动作”。一个具体的例子是创建一个“addItemToBasket”突变,而不是有 3 个突变来更新与您的购物篮相关的各个表格等。

GraphQL 非常注重前端开发,因此您的变更通常应该与用户可以在您的前端执行的操作非常相似。例如。您的前端有一个“添加到购物篮”按钮,您的后端有一个“addItemToBasket”突变,类似于将商品放入用户购物篮的操作。

如果您在设计变更时考虑到这一点,那么大多数时候您不应该遇到部分更新的问题,因为变更确切地知道要做什么并且您不只是让用户使用您的模式随意更新字段。

如果出于某种原因您需要进行这些部分更新,除非您的数据提供商支持,否则您可能无法自行实施修补程序。这意味着您将必须有一个具有可为空属性的输入对象类型和决定哪些字段已更改并使用您的数据提供程序更改它们的突变。

话虽这么说,但在 Hot Chocolate 存储库中还有一个修补类型的提案,应该会简化修补部分:https://github.com/ChilliCream/hotchocolate/issues/1326