我正在为后端和实体框架开发一个基于v6的ASP.NET MVC项目。有时,有一些CRUD操作,只更新实体上的2-3个字段,在这种情况下,我可能会对这种情况下哪种方法更适合最佳实践感到困惑。例如,假设我有一个Employee实体,其属性如下所示:
员工: Id,状态,姓名,姓氏,工作,部门,HireDate,BirthDate,地址,更新.
假设状态、部门和更新字段的更新,我可以为以下方法执行此操作:
方法I:
我可以创建employee.ts文件的一个实例,并仅通过要更新的字段在component.ts中填充它,然后将其传递给service.ts并传递给Controller.cs。在Controller中,我接收作为Employee实体模型的模型,并在Controller中设置Updated字段,并将该Employee实体传递给Service.cs,然后使用相关的EF方法保存该实体。
方法II:
我只需将Id、状态和部门值从Component.ts发送到service.ts,然后将其作为int值传递给Controller (Id)。然后在控制器中创建一个Employee.cs实体的新实例,并填充这3个字段和更新字段。然后将该实体传递给Service.cs,然后使用相关的EF方法保存该实体。
方法III:
与方法II相同,直到Controller.cs为止。然后将这3个参数传递给Service,然后通过Id参数从数据库中检索员工。然后设置其他字段并保存实体。
我认为其中3种方法可以使用,但不确定在EF的角度项目中哪一种更适合这种情况?任何帮助都将不胜感激..。
发布于 2019-05-06 21:36:28
方法3,或
方法4:使用要更新的PK &字段创建UpdateEmployeeViewModel,以填充TS,传递给验证数据、加载实体、传输适当值和保存的控制器。当它是一两列时,那么方法3就可以了。如果它增长到更多,那么我通常选择#4。
我会不惜一切代价避免使用方法1。让代码信任从客户端传递的实体太方便了。对服务的调用可以被拦截和调整,因此如果服务器代码接受一个实体,您可以很容易地找到执行DbSet.Update或DbSet.Attach的代码,这可能导致被篡改的数据被持久化到数据库。
在执行更新时,方法2也会留下问题,因为实体应该始终反映其数据行。创建一个实体,然后只部分填充它,然后尝试更新数据状态,可能会导致无意中的更新,例如清除值。在这条道路上,您可能有其他接受实体作为参数的通用方法,但在传递的实体可能是完整的(从DB加载)和不完整(由更新方法构造)的情况下。
按ID加载实体非常快,因此很少需要过度优化。它还可以帮助检查行版本#,以确保您正在更新的实体的版本与仍在DB中的版本相匹配。(自从您最初将该行发送给客户端以来,是否还有其他人更新了该行?)
https://stackoverflow.com/questions/56011737
复制相似问题