P30 整体更新/替换资源 PUT




url上带employeeId。参数一共是需要两个 一个是companyId另外一个是employeId

还需要第三个参数就是传进来的请求的对象、创建EmployeeUpdateDto

直接复制EmployeeAddDto的代码到UpdateDto里面
他俩的代码虽然是一样的,但是干的活并不一样。大部分情况下他来是不是一样的,只不过是我们的例子太简单了。所以这里他俩代码暂时是一样的

我们需要手动简单companyId对应的company存在,然后EmployeeId所对应的Employee是否存在。

这两代代码比较简单。写完直接贴进来

我们要做更替更新和替换是资源。下面三个步骤。

由于我们使用的autoMapper功能比较强打,它一句话就把这三个步骤完成了。

配置映射,从updateDto到Entity的AutoMapper的映射。

然后调用更新的方法就可以了

updateEmployee里面我们并没有写还起作用了。这是因为DbContext Entity Framework它的事,大概的意思就是Entity查出来之后,它的属性都是被跟踪,一旦它的属性变化了之后,DbContext就知道了,知道之后呢。

一执行SaveChangesAasync这个方法之后,这些变化就被写入到数据库里面。所以说Update方法不写代码也会执行更新。

既然什么都不需要写,那么我们为什么还要写这个方法呢????

y因为Repository这种模式。它是要求与存储技术无关的。就是我们的EFCore它要更新的话不需要写什么代码,如果我们不使用EFCore来实现这个Repository,使用其他的技术,那么这个更新操作就可能需要写一些其他的代码。

那么为什么要使用Repository这种模式呢?
首先它能做到与存储无关。让我们在写Controller只关心这个业务逻辑就可以了。Repository相当于进行了一层抽象, 做成了一些合约相当于,让你在写代码的时候,只关心这些合约就可以了。也就是说这些业务。再有一点就是你在Controller直接写EF的代码的话,你可能到处都是重复的代码。重复之后呢,就可能改了一个地方就忘记了另外一个地方。就容易出错。Repository进行了抽象,形成合约之后,这个问题就可以避免。
再就是它有利于单元测试。由于它使用ICompanyRepository接口,简单的就可以进行mock

所以这个Update操作之后,我们只需要进行save操作就可以了

下面考虑下返回什么,可以返回200 OK。然后OK里面带着更新后的资源一同返回去,或者我们可以返回204 noCountent 就是响应body里面没有内容。这个也是合理的。这个就根据需要来定了。
在这里我们就返回一个204吧。

测试运行

请求的地址比较长


body里面需要注意下,我们需要把所有的资源都写上。


如果你不想更新某个字段,就要把原来的值写上,否则的话就会更新成默认值了。
这里面我就做了一个更新,把工号加了3个0

看下Headers

发生了错误

这是因为刚才自定义的Attribute。这里先注释掉



下面查询一下这个资源。声音GET的方式



然后再把id和CompanyId这两个字段都复制过来再测试PUT请求。然后把id结尾都改成00结尾的。

结构仍然是204成功的

我们再查询一下,查询的结果 id和CompanyId并没有受到传过来的那个两个id的影响。因为我们的updateDto并不包含那两个属性。


验证相关的代码先注释掉

firstName和lastName这两个属性去掉。

其他属性也都去掉吧,就留一个属性

firstName是不可以为空的

Gender和dateOfBirth没有要求必填,但是实际上也要必填的。

去掉gender和dateOfBirth

这个时候请求成功了。

gender和dateOfBirth都成了默认值。geder是没类型的 默认是0. 日志的话默认是000年开始的 所以这里到2019年就是2019

所以Put操作就需要把原来的值写上,否则这个属性就会被更新成默认值。

Put action不是安全的,是有副作用的。但是它是幂等的。发送一次和多次它们的副作用都是一样的

把验证都加回来

目前我们的UpdateDto和AddDto高度一致,重复
提取出来一个抽象类

里面的内容呢,复制AddDto的内容

让后让AddDto继承AddOrUpdateDto这个类,其他的东西就都不需要了。

UpdataDto也继承


有一个地方有区别,这个自定义的Attribute

这里它针对的是EmployeeAddDto

现在由于它把这个属性放在抽象类上面了。我们的UpdateDto也会用。所以UpdateDto在验证的时候就会出错, 因为它不是AddDto这个类型、


这里我们只需要改一下 就可以了



如果有的属性,add是必填的,update不是必填的呢 怎么处理呢?只需要给属性加上abstract抽象这个属性就可以了。 那么AddDto和UpdateDto分别来实现属性就可以了。

这我们暂时没有这个需求,所以先改回去

测试

测试post



留作业:
枚举和datetime类型的字段,怎么进行输入验证



结束

原文地址:https://www.cnblogs.com/wangjunwei/p/12589254.html