我正在使用 ASP.Net Web API 和 Code First Entity Framework,根据我的阅读,您通常应该在操作方法中直接公开 DTO 对象而不是实体对象(根据 http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-5 )。
所以在我正在处理的一个案例中,为了避免上面链接中描述的“过度发布”问题,我创建了一个 DTO 对象,其属性几乎与模型对象完全相同。然而,我想知道的是,我是否需要为 DTO 和模型属性复制所有相同的验证属性集(例如 [Required]、[Range(N,M)] 等)?最初我希望不需要到(以避免重复)但是如果你想利用绑定(bind)验证(即 ModelState.IsValid),你需要 DTO 上的验证属性,如果你希望使用适当的约束创建数据库([Required ] -> 不为空等)
没有更好的办法吗?
另外,是否有一些实体确实使用但模型绑定(bind)验证没有使用的属性?例如,虽然 [Range(n,m)] 会明显影响某些客户端输入的验证,但实体是否根本关心它(据我所知,它似乎不会影响创建的数据库模式?)
最佳答案
实体应该只具有实际对数据库有影响的属性。 DTO 不应该有任何用于验证的属性,除了 DataMemberAttribute 来定义属性是否是必需的以及它应该以什么顺序显示等。对于 OData,您还必须设置 KeyAttribute。 模型应该具有验证属性。因为 DTO 和模型可能几乎相同,所以您为每个需要验证模型的 dto 创建了一个模型,只需将 dto 的值交换为模型的对象。现在您可以验证它,如果您没有对模型使用 ValidationAttributes,您可以验证它们,例如使用 FluentValidation
长话短说:
实体只获取实际影响数据库架构的属性
DTO 是没有验证逻辑的简单对象,DataMemberAttribute 除外
模型应具有验证属性(仅在需要时使用,使用 FluentValidation 时不需要)
POST 的工作流程是: -> DTO 进来 -> 将 dto 交换到模型 -> 验证模型 -> 将模型交换到实体 -> 在数据库中存储实体 -> 使用更新后的实体并将其交换到新的 dto -> 返回 dto
您好, 伏打
关于c# - DTO 上的 ASP.Net Web API 验证属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264480/