2013-04-04 54 views
0

我有一個單獨的.dll與我們的數據庫模型和部分類等使用FluentValidation工作正常(這是由桌面條碼終端和我們的網站都使用它)。MVC FluentValidation與實體框架在單獨的.dll

對於桌面應用程序,我可以讀取並顯示所有的錯誤,如下面

public override int SaveChanges() 
    { 
     var errors = this.GetValidationErrors(); 
     if (errors.Any()) 
     { 
      //handle validation errors 
      return 0; 
     } 
     else 
     { 
      return base.SaveChanges(); 
     } 
    } 

對於MVC網站,我可以設置在單獨的模型驗證或創建數據的註釋,並得到這些工作的好(這是不是有什麼我想要)。我無法理解的事情是如何強制我的模型映射到實體,以便能夠在視圖中顯示流暢的驗證消息。我不希望維護兩套獨立的邏輯,並且條形碼應用程序和網站必須使用相同的邏輯。

我是否必須將我的實體直接映射到視圖?我一直認爲這是一件壞事,不夠靈活。或者有什麼方法可以說明模型中的字段映射回我的某個實體的屬性?也許是一些描述的註釋。

編輯:

只是一些澄清的,我需要的類型的驗證。

大多數前端輸入類型驗證仍然保留在viewModels(必需/長度/密碼匹配等 - 基本上我可以用於客戶端驗證的所有東西)。但是,我不想在那裏進行所有業務邏輯驗證。像電子郵件地址之類的東西必須在設置其他選項之前進行驗證,帳戶號碼必須是基於名稱的特定格式(我不能用正則表達式做的事情)。這個特定的日期不是有效的交貨日期等。

我想我可以做的一件事就是將這些添加到ValidationSummary中,並將它們與各個字段分開顯示。

回答

1

只是一個更新。爲了得到我需要的兩層驗證,我必須將所有實體模型類標記爲IValidatable。然後我重寫每個類的驗證方法,並在那裏調用我的流暢驗證驗證器方法,傳回所需的錯誤。對於modelstate.addmodelerror我將該鍵設置爲字段名稱,並將其映射回來沒問題。多一點的代碼,但它的作品。如果我找到一個更好的方法來做這個病態的更新。

1

我想你只是在看錯的情況。 MVC的全部內容是關注的分離。數據庫需要知道的事情是你的觀點可能不太在意,反之亦然。這就是爲什麼推薦的做法是將視圖模型與視圖一起使用,而不是實體本身。

驗證是相同的。類似於密碼確認需要與用戶輸入的密碼相匹配的事實根本不涉及數據庫。或者更恰當地說,像密碼中最小字符數量的驗證與數據庫無關;它只會收到密碼的醃製和散列版本。因此,將這種驗證放在您的實體上將是錯誤的。它屬於視圖模型。

當我第一次開始使用MVC時,我曾經將所有驗證邏輯添加到我的實體類中,然後在我的視圖模型上重複同樣的驗證。隨着時間的推移,我開始意識到實際上需要的驗證非常少。事實上,絕大多數的驗證應該只是放在你的視圖模型上。它充當各種看門人的角色;如果數據足夠滿足您的視圖模型,那麼您的數據庫就足夠好了。在您的實體上有意義的驗證類型是Required之類的東西,但即使如此,只有在必須到達數據庫時具有值的可空字段上纔是必需的。像DateTimes這樣的事情默認情況下是不可空的,而且EF足夠聰明,使它們在默認創建的表上不可空。 MaxLength有時是值得的,如果應該對數據庫中的文本字段的長度有一個嚴格的限制,但通常情況下,nvarchars工作得很好。

反正問題是,如果你真的坐下來開始評估你的實體驗證,你可能會看到,大部分是隻適用於應用程序如何工作和怎樣的商業邏輯數據在數據庫級別表示。這是關鍵的要點:在您的實體上,您只需要數據庫所需的驗證。這通常很薄。

+0

嗨克里斯和謝謝,我更新了我的問題,以解釋我需要更好的類型。不幸的是,即使最簡單的更新可以發生,我們也確實需要滿足一大堆標準,並且由於兩個單獨的程序必須使用它,所以我真的需要它。 – 2013-04-04 19:58:09

+0

您的視圖模型也可以共享。只需將它們添加到您的類庫中即可。我唯一的觀點是,你應該從驗證的角度來看待你的視圖模型。從實體的角度來看,您唯一需要擔心的是完美的數據庫完整性問題。 – 2013-04-04 20:58:07