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