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数据的更改而自动更新.这个场景其实在我所经历的项目中用到的不是特别多,因为客户可能直接点击刷新按钮就直接看到了最新的数据,而不是那种一直不刷新然 ...
随机推荐
- spring 拦截器实现token校验登录
pom文件 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</art ...
- angularjs中控制视图的控制器的两种注入依赖项及服务的写法
在AngularJS中,控制器是用于控制视图行为的重要组件.当定义控制器时,有两种主要的方式注入依赖项: 1. 显式依赖注入,聚聚使用字符串数组形式来注入依赖项: myapp.controller(' ...
- 【赵渝强老师】MongoDB的inMemory存储引擎
一.MongoDB的存储引擎概述 存储引擎(Storage Engine)是MongoDB的核心组件,负责管理数据如何存储在硬盘(Disk)和内存(Memory)上.从MongoDB 3.2 版本开始 ...
- go语言中变量的作用域
Go 语言中的变量作用域规则决定了变量在程序的哪些部分是可见的和可以访问的.理解这些规则对于编写清晰.维护性高的代码非常重要.下面是一个系统性的解释. 变量的作用域类型 包级作用域: 包级作用域的变量 ...
- CNN每层卷积结果视觉展示(3Dircadb肝脏数据为例)
试着展示了肝脏每层卷积之后的结果.代码如下: import torch import torch.nn as nn import SimpleITK as sitk import numpy as n ...
- OpenGL RHI优化
前言 随着Vulkan的普及,OpenGL已经在被慢慢淘汰,更轻的API调用可以节省不少性能,尤其是在移动平台上,可以减少CPU开销,进而减少功耗.看起来很完美,但是问题是目前移动平台Vulkan驱动 ...
- Fluent Operator 2.5.0 发布:新增多个插件
日前,Fluent Operator 发布了 v2.5.0. Fluent Operator v2.5.0 新增 11 个 features, 其中 Fluent Bit 新增支持 7 个插件, Fl ...
- 云原生周刊:K8s 在 v1.27 中移除的特性和主要变更
文章推荐 K8s 在 v1.27 中移除的特性和主要变更 随着 Kubernetes 发展和成熟,为了此项目的整体健康,某些特性可能会被弃用.移除或替换为优化过的特性.基于目前在 v1.27 发布流程 ...
- 在 Kubernetes 中部署并使用 KubeEdge
作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及 Kubernetes.KubeSphere.KubeKey 等. 边缘计算在广泛制造业.工业.零售和金融等行业, ...
- PHP实现断点续传
解释 业务上要求对资源文件进行加密,遂实现通过php接口调用,修改header头,传输流的方式. 测试中,在苹果手机上,如果文件过大(大概10M以上),会主动调用多次接口.此时如果不使用断点续传的方式 ...