|
0
|
| Fabricio Rodriguez · 技术社区 · 7 年前 |
|
|
1
1
坦白说,是的,你做错了什么。出于很多原因,您永远不应该保存从用户输入创建的实例(即
简单地说,这
有很多方法可以从技术上解决这个问题。例如,你可以使用
然而,如果你试图添加一个完全不同的人,那就会产生问题。这里有一个更大的问题是,你有一个行动,承担双重责任。根据REST,POST是不可替换的,只应被制作成包含或幂等元的资源。更简单地说,你只发布到一个资源,比如
撇开理论不谈,简单的一点是你应该有两个行动:
最后,即使如此,在进行更新时,保存person参数直接会让用户过于信任。最终用户可能无法通过更新修改任意数量的属性(例如“创建”日期),但当您这样做时,它们可以修改。在某些方面,更糟糕的是,即使用户不是恶意的,你仍然依赖他们发布帖子 全部的 该实体的数据。例如,如果您确实创建了日期属性,但用户没有在更新时发布该属性(老实说,为什么 将 您发布了一个创建的日期以及一个更新资源的请求),那么它将具有清除该属性的效果。如果有默认值,它将被设置回该值,如果没有,如果列不为空,您可能会在保存时实际收到异常。 长话短说,这不是个好主意。相反,请使用视图模型、DTO或类似工具。该类应该只包含您想让用户在创建时修改甚至影响的属性。然后,在更新的情况下,从数据库中提取新的资源,并将param实例中的值映射到该数据库上。最后,将版本从数据库保存回数据库。这确保了1)用户不能修改您不明确允许的任何内容,2)用户只需发布他们真正关心修改的内容,3)实体将被正确跟踪,EF将在保存时正确发出update语句。 |