2014-12-03 73 views
6

我正在使用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上的ASP.Net Web API驗證屬性?

所以在一個案例中,我正在努力避免上面鏈接中描述的「over-posting」問題。我創建了一個幾乎與模型對象具有相同屬性的DTO對象。然而我想知道的是,我是否需要爲DTO和模型屬性複製所有相同的驗證屬性集(例如[必需的],[範圍(N,M)]等?最初我希望不要以避免重複,但是如果要利用綁定驗證(即ModelState.IsValid)和主模型(如果希望使用適當約束創建數據庫),則需要DTO上的驗證屬性([必需] - >不爲空,等等)

難道就沒有更好的辦法

此外,是否有一些屬性實體中使用,但該模型綁定驗證不使用例如,當[範圍(N? ,m)]顯然會影響某些客戶端輸入的驗證,但實體是否真的關心它(它似乎不會影響創建的數據庫我可以告訴的模式?)

回答

6

實體應該只有實際上對數據庫有影響的屬性。 DTO不應具有用於驗證的任何屬性,除了DataMemberAttribute用於定義屬性是否是必需的以及它應以何種順序顯示等。對於OData,您還必須設置KeyAttribute。 模型應該具有驗證屬性。因爲DTO和模型可能幾乎完全相同,所以您需要爲每個需要驗證模型的dto創建,並將dto的值交換到模型的對象。現在,你可以驗證它,如果你不使用ValidationAttributes的模型,你可以驗證它們例如用FluentValidation

所以長話短說:

  • 實體只能得到這實際上影響到數據庫的模式屬性

  • DTO的是沒有驗證邏輯簡單對象,除了DataMemberAttribute

  • 模型應具有屬性驗證(ONL Ÿ如果需要的話,不需要使用FluentValidation)時

對職位的工作流程將是: - > DTO進來 - >交換DTO,將型號 - >驗證模型 - >交換模型實體 - >店鋪在數據庫實體 - >使用更新的實體,它換到一個新的DTO - >返回DTO

問候, 伏打

+4

「交換DTO到模型」,然後驗證模型,這將如何工作的?與交換我想你的意思是地圖dto模型?如果是的話,ModelState仍然會在dto上運行,因爲這個通過了。短篇小說:你把你的DTO的屬性放在你的DTO上嗎? – Elisabeth 2015-06-29 08:52:34

+0

您可以使用AutoMapper或任何其他框架將DTO映射到模型,或者只需手動完成。 Required屬性用於確保您願意處理的dto的狀態。該模型不需要必需的屬性,只需要DTO。您可以爲您的模型編寫一個基類,將DTO保存爲某種狀態,然後您可以將DTO的屬性作爲模型的屬性公開。 – Voltaic 2015-06-29 10:57:49

+0

如果是這種情況,那麼將底層模型的信息傳遞給客戶的策略是什麼?如果一個字段是無效的,那麼不用打到服務器就知道了。我會爭辯說,如果在更新操作中使用dto,那麼將驗證或其他業務邏輯放在dto中,這樣客戶端就可以事先知道如何形成請求。 – Watson 2017-03-09 22:51:17