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类型的字段,怎么进行输入验证
结束
标签:这个,代码,更新,我们,需要,PUT,P30,替换,属性 来源: https://www.cnblogs.com/wangjunwei/p/12589254.html