c# - DTO 上的 ASP.Net Web API 验证属性?

标签 c# entity-framework validation asp.net-web-api

我正在使用 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/

相关文章:

c# - 身份服务器 4 : adding claims to access token

c# - HTML XPath 按类名搜索

c# - 如何将包含 "NOT IN"约束的 SQL 语句转换为其等效的 LINQ?

entity-framework - 应用程序架构 mvc4 ef5

Laravel Livewire validateOnly 一组特定的规则

javascript - 使用 Javascript 验证多项选择单选按钮

C# 如何在运行时转储所有变量和当前值

C#库截屏?

asp.net-mvc-3 - MVC3 删除 ModelState 错误

sql - 如何在 Entity Framework 5 中使用基于 SQL session 的表