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

Nei*_*ury 7 c# validation entity-framework 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和模型属性复制所有相同的验证属性集(例如[必需],[范围(N,M)]等?最初我希望不是to(避免重复)但如果你想利用绑定验证(即ModelState.IsValid),你需要DTO上的验证属性,如果你想用适当的约束创建数据库,你需要在主模型上([必需] ] - > not null等)

有没有更好的方法?

此外,是否有一些Entity确实使用的属性,但模型绑定验证不使用?例如,虽然[Range(n,m)]将明显影响某些客户端输入的验证,但实体是否完全关心它(它似乎不会影响我所知道的创建的DB模式?)

Vol*_*aic 6

实体应该只具有实际对数据库产生影响的属性.DTO不应具有任何验证属性,除了DataMemberAttribute以定义是否需要属性以及它应以何种顺序显示等.对于OData,您还必须设置KeyAttribute.模型应具有验证属性.因为DTO和模型可能几乎相同,所以您需要为每个需要验证模型的dto创建,并将dto的值交换到模型的对象.现在您可以验证它,如果您没有对模型使用ValidationAttributes,您可以验证它们,例如使用FluentValidation

长话短说:

  • 实体仅获取实际影响数据库模式的属性

  • DTO是简单的对象,除了DataMemberAttribute之外没有验证逻辑

  • 模型应具有验证属性(仅在需要时,在使用FluentValidation时不需要)

POST的工作流程将是: - > DTO进入 - >交换到模型 - >验证模型 - >交换模型到实体 - >在数据库中存储实体 - >使用更新的实体并将其交换到新的dto - >返回dto

问候,Voltaic

  • "交换到模型"然后验证模型,这将如何工作?随着交换,我猜你的意思是将地图dto映射到模型?如果是,ModelState仍然会在dto上运行,因为这个传递了.短篇小说:你把DOT的必需属性? (4认同)
  • 我不同意,有时将DTO用作输入和输出,DTO模型是控制器动作的输入,并且验证由框架处理,您可以使用`ModelState.IsValid`进行检查。 (2认同)