我使用的是ASP.Net Web API和Code First Entity Framework,从我所读过的内容中,您通常应该直接在操作方法中公开DTO对象而不是实体对象(根据{ {3}})。
因此,在一个案例中我正在努力,以避免过度发布""过度发布"如上面链接中所述,我创建了一个DTO对象,其中几乎所有属性都与模型对象相同。我想知道的是,我是否需要为DTO和模型属性复制所有相同的验证属性集(例如[必需],[范围(N,M)]等?最初我是希望不(为了避免重复)但是如果你想利用绑定验证(即ModelState.IsValid),你需要DTO上的验证属性,如果你想用适当的约束创建数据库,你需要在主模型上( [必填] - >非null等。)
有没有更好的方法?
此外,是否有一些Entity确实使用的属性,但模型绑定验证不使用?例如,虽然[Range(n,m)]将明显影响某些客户端输入的验证,但实体是否完全关心它(它似乎不会影响我所知道的创建的DB模式?)< / p>
答案 0 :(得分:5)
实体应该只具有实际对数据库产生影响的属性。 DTO不应具有任何验证属性,除了DataMemberAttribute以定义是否需要属性以及它应以何种顺序显示等。对于OData,您还必须设置KeyAttribute。 模型应具有验证属性。因为DTO和模型可能几乎完全相同,所以您需要为需要验证模型的每个dto创建,并将dto的值交换到模型的对象。现在您可以验证它,如果您没有对模型使用ValidationAttributes,您可以使用FluentValidation
验证它们。故事很长:
实体只获取实际影响数据库架构的属性
DTO是简单的对象,没有验证逻辑,除了DataMemberAttribute
模型应具有验证属性(仅在需要时,在使用FluentValidation时不需要)
POST的工作流程将是: - &GT; DTO进来 - &gt;交换到模型 - &gt;验证模型 - &gt;将模型交换为实体 - &gt;将实体存储在数据库中 - &gt;使用更新的实体并将其交换为新的dto - &gt;返回dto
问候, 伏打