我正在开发一个 MVC3 项目,我注意到当从 UI 更新该记录时,数据库中的某些字段被设置为空。发生这种情况是因为这些字段在发布时的表单上不存在。我知道这可以通过为这些添加 HiddenFor 条目来解决,但这不是一个好方法,因为还需要在那里添加任何新字段。我希望能找到更好的解决方案。
关于项目结构的一些详细说明:
我们有与 EF 实体完全匹配的 DTO,以简化映射。因此,DTO 的每个字段都存在于实体和数据库中。我们使用 DTO 作为我们的模型。
控制器将 DTO 传递给服务层。服务层将 DTO 映射到其各自的实体(使用 AutoMapper),并将其传递给持久层。持久层实际上是使用 DbContext 来保存更改。
假设我们有一个带有 Name 成员和 FolderPath 成员的 Client DTO,以及一个在其表单上只有 Name 成员的视图。表单发布,并且该 FolderPath 为空。该空值一直持续到持久层中的更新。在某个地方,我必须指定我不希望该特定值覆盖数据库中的内容。
从我收集的关于 SO 的研究中收集了大约一个小时,一种方法可能是......
- 对于我们知道我们将在视图中的表单上拥有的一组特定字段,保持 DTO 的范围最小。
- 根据此答案,告诉 AutoMapper 忽略目标中存在的任何内容,但不忽略源中存在的任何内容。
- 在服务层,在将 DTO 映射到实体时,首先从数据库中检索现有的实体。映射只会覆盖属于 DTO 的成员,并且任何其他值都将保留,因为它们是从数据库中检索的。
这会是一种有效的方法吗?有没有更好或更常见的方法来解决这个问题?