我正在ASP.NET MVC上针对后端和实体框架的Angular(v6)项目中进行工作。有时,有些CRUD操作只能更新实体上的2-3个字段,在这种情况下,我可能会困惑于哪种方法对这种情况的最佳做法更好。举例来说,假设我有一个Employee实体,其属性如下所示:
雇员:ID,状态,姓名,姓氏,工作,部门,雇用日期,出生日期,地址,更新...
假设状态,部门和已更新字段为更新,则可以通过以下方法执行此操作:
方法I:
我可以创建employee.ts文件的实例,并仅通过要更新的字段将其填充到component.ts中,然后将其传递给service.ts并传递给Controller.cs。在Controller中,我将模型作为Employee实体模型接收,并在Controller中设置了Updated字段,并将此Employee实体传递给Service.cs,然后使用相关的EF方法保存该实体。
方法II:
我只是将Component.ts的Id,Status和Department值发送到service.ts,然后将它们作为int值(Id)传递给Controller。然后在控制器中创建Employee.cs实体的新实例,并填写这3个字段和Updated字段。然后将此实体传递给Service.cs,然后使用相关的EF方法保存该实体。
方法III:
与方法II相同,直到Controller.cs。然后将这3个参数传递给Service ts,然后通过Id参数从数据库中检索Employee。然后设置其他字段并保存实体。
我认为可以使用其中的3种,但是不确定在具有EF的Angular项目中哪种方案更适合这种情况?任何帮助将不胜感激...
答案 0 :(得分:1)
方法3或
方法4: 使用要更新的PK&字段创建一个UpdateEmployeeViewModel,以将其填充到TS中,并传递给控制器以验证数据,加载实体,传输适当的值并保存。如果是一两列,则方法3很好。如果它增长到更大,那么我通常会选择#4。
我将不惜一切代价避免采用方法1。让代码信任从客户端传递的实体太方便了。可以拦截和调整对服务的调用,因此,如果您的服务器代码接受一个实体,则可以轻松找到执行DbSet.Update
或DbSet.Attach
的代码,这些代码可能导致被篡改的数据持久保存到数据库中。 / p>
由于实体应始终反映其数据行,因此执行更新时方法2也存在问题。创建一个实体并仅部分填充它,然后尝试更新数据状态可能会导致意外的更新,例如清除值。在将来,您可能会使用其他通用方法来接受实体作为参数,但是在某些情况下,所传递的实体可能是完整的(从DB加载)与不完整的(由更新方法构造)
通过ID加载实体非常快,因此几乎不需要过度优化。它还可以帮助检查行版本号,以确保要更新的实体的版本与仍在数据库中的版本匹配。 (自您最初将其发送给客户端以来,是否有人更新了此行?)