GraphQL Part VII: 实现数据变更
我们已经可以使用各种方式来获取数据了。但是如何修改服务器端的数据呢?包括数据插入,修补,删除或者更新等等。GraphQL 的 mutation 就是负责这部分的。
在我们继续之前,我想对项目做一点调整, HelloWorldQuery 调整为 InventoryQuery,同时,HelloWorldSchema 也调整为 InventorySchema。当然,我也从根肿删除了 hello 和 world 这两个字段。
Mutaion 类型也是从 ObjectGraphType 派生的,下面的 createItem 字段,其实可以理解为一个方法,将可以在服务器端创建一个条目并返回它。
public class InventoryMutation : ObjectGraphType
{
public InventoryMutation(IDataStore dataStore)
{
Field<ItemType>(
"createItem",
arguments: new QueryArguments(
new QueryArgument<NonNullGraphType<ItemInputType>> { Name = "item" }
),
resolve: context =>
{
var item = context.GetArgument<Item>("item");
return dataStore.AddItem(item);
});
}
}
这里,我们使用了一个新的 ItemInputType 作为请求参数。从前,我们在示例中使用了单值类型作为参数,但是,对于复杂类型作为参数,还是有点不同的,这里我们定义了新的类型 ItemInputType。它需要从 InputObjectGraphType 派生。
public class ItemInputType : InputObjectGraphType
{
public ItemInputType()
{
Name = "ItemInput";
Field<NonNullGraphType<StringGraphType>>("barcode");
Field<NonNullGraphType<StringGraphType>>("title");
Field<NonNullGraphType<DecimalGraphType>>("sellingPrice");
}
}
我们需要实际更新服务器端的数据,所以,在 DataSource 中,它使用 ApplicationDbContent 将新的条目添加到 DBSet<Item> Items 集合中。
public async Task<Item> AddItem(Item item)
{
var addedItem = await _applicationDbContext.Items.AddAsync(item);
await _applicationDbContext.SaveChangesAsync();
return addedItem.Entity;
}
注意,我们将新添加的条目返回个 createItem 端点,以便我们可以查询新创建条目的字段。这也是建议的方式。
Just like in queries, if the mutation field returns an object type, you can ask for nested fields. This can be useful for fetching the new state of an object after an update. - GraphQl Org.
在运行应用之前,还需要将新的类型注册到依赖注入容器中。
services.AddScoped<ItemInputType>();
services.AddScoped<InventoryMutation>();
别忘了,还需要在 Schema 中注册我们新创建的 Mutation 对象。
public class InventorySchema : Schema
{
public InventorySchema(InventoryQuery query, InventoryMutation mutation)
{
Query = query;
Mutation = mutation;
}
}
现在,让我们在 GraphiQL 中运行如下的请求。
mutation {
createItem(item: {title: "GPU", barcode: "112", sellingPrice: 100}) {
title
barcode
}
}
这将添加一个新的条目,并返回新创建条目的 title 和 barcode 字段。

你还可以使用 Varible 执行。

GraphQL Part VII: 实现数据变更的更多相关文章
- SQL Server 数据变更时间戳(timestamp)在复制中的运用
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two ...
- SqlServer Change Data Capture(CDC)数据变更捕获
最近在使用SqlServer2008r2数据库做系统的时候,在某些重要的.经常涉及到修改的表上,想加上一些恢复机制,一开始想找找看看有没有类似Oracle数据库闪回那样的功能,后来发现CDC的功能可以 ...
- 使用SQLServer 2008的CDC功能实现数据变更捕获
原文:使用SQLServer 2008的CDC功能实现数据变更捕获 最近由于工作需要,研究了一下2008 CDC功能,觉得还不错,下面整理了一下研究过程,虽然比较粗略,但是基本上能用了,如果有补充请大 ...
- Step6:SQL Server 数据变更时间戳(timestamp)在复制中的运用
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two ...
- problem:vue之数据变更没有触发视图更新问题
前言: 数据变更之后,vue如何渲染dom? 实际场景: 更新数据之后,再设置滚动条的位置为什么设置无效? 为什么将隐藏的元素设置为显示状态之后,读取元素状态读取不到? 改变了对象/数组中的值,页面没 ...
- debezium 数据变更工具使用
1. 作用 简单概述就是CDC(change data capture),实时数据分析领域用的比较多 2. 简单使用(基于官网的docker 说明) 备注: 测试没有使用守护进程模式为了方便测 ...
- EF Core 数据变更自动审计设计
EF Core 数据变更自动审计设计 Intro 有的时候我们需要知道每个数据表的变更记录以便做一些数据审计,数据恢复以及数据同步等之类的事情, EF 自带了对象追踪,使得我们可以很方便的做一些审计工 ...
- 在SSIS 2012中使用CDC(数据变更捕获)
最新项目稍有空隙,开始研究SQL Server 2012和2014的一些BI特性,参照(Matt)的一个示例,我们开始体验SSIS中的CDC(Change Data Capture,变更数据捕获). ...
- Swing-JTable检测单元格数据变更事件
在JTable的初级教程中往往会提到,使用TableModel的 addTableModelListener方法可以监听单元格数据的变更,在其事件处理函,数tableChanged中,可以通过e.ge ...
- Salesforce Integration 概览(六) UI Update Based on Data Changes(UI自动更新基于数据变更)
Salesforce用户界面必须由于Salesforce数据的更改而自动更新.这个场景其实在我所经历的项目中用到的不是特别多,因为客户可能直接点击刷新按钮就直接看到了最新的数据,而不是那种一直不刷新然 ...
随机推荐
- SpringBoot 实现文件上传
参考:Java springboot进阶教程 文件上传功能实现 后端代码编写 常见错误分析与解决 在 Service 业务层接口中增加一个上传文件的方法 因为文件并不是上传至数据库中,所以不需要编写 ...
- Windows 中的硬链接、目录联接(软链接)、符号链接、快捷方式
在Linux文件系统中经常提及硬链接(Hard Link)和符号链接(Symbolic Link),Windows中也可以创建链接,但由于丰富的图形界面操作,很少提及链接.Windows 的 NTFS ...
- 仿函数(Functor)是什么?
仿函数(Functor) 仿函数是通过重载()运算符的类或结构体的对象.这样一个对象可以像普通函数一样被调用. 仿函数通常用于需要在对象内部保留状态或多次调用时有特定行为的情况. 特点: 仿函数是一个 ...
- php获取支付宝用户信息
php获取支付宝用户信息 一:创建应用 要在您的应用中使用支付宝开放产品的接口能力: 您需要先去蚂蚁金服开放平台(open.alipay.com),在开发者中心创建登记您的应用,此时您将获得应用唯一标 ...
- USB gadget驱动框架(六)
本节主要介绍udc驱动枚举过程,需结合udc驱动.composite.c.function等一同分析整个过程. udc驱动中断处理函数 当host检测到DP上拉,则认为有新的device插入,此时ho ...
- USB编码方式(NRZI)及时钟同步方式
1.概述 在同步通讯系统中,两个设备通讯则需要同步信号,同步信号分为时钟同步信号和自同步信号两种,时钟同步方式在通讯链路上具有时钟信号(IIC.SPI),自同步方式在通讯链路中没有同步信号(PCIE. ...
- python中的内置函数zip函数
关于zip()函数,有几点要讲的. 首先,官方文档中,它是这样描述的: Make an iterator that aggregates elements from each of the itera ...
- el-tree 懒加载复选框默认展开和默认选中
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- Robust Loop Closure by Textual Cues in Challenging Environments
arxiv | 南洋理工大学开源 基于文本线索实现复杂环境中的鲁棒闭环检测 [Robust Loop Closure by Textual Cues in Challenging Environmen ...
- pandas的一些基本操作
Pandas 是一个开源的数据分析和操作库,它是 Python 编程语言的一个扩展.Pandas 提供了快速.灵活和表达能力强的数据结构,旨在使数据清洗和分析工作变得更加简单易行. 1.为什么要学习p ...