當用戶將其更改保存在動態數據屏幕中時,我正在尋找解決方案來執行一些自定義實體驗證(這將需要數據庫訪問,跨成員驗證...)與實體框架。
驗證比我可以用屬性(它需要訪問數據庫等)更復雜使用動態數據自定義高級實體驗證
你可以攔截SaveChanges調用嗎?
我試圖覆蓋DbContext對象中的ValidateEntity
,但動態數據似乎沒有調用它(可能是因爲它使用內部ObjectContext,不知道爲什麼),並且覆蓋SaveChanges也沒有幫助。
我沒有看到,我可以訂閱任何事件......
的documentation應該有所幫助:
自定義驗證爲單個數據字段通過重寫 的OnValidate方法或處理驗證事件當任何數據字段被改變時被調用 。通過這種方法,您可以爲單個字段添加驗證 和業務邏輯。這種方法通常比爲單個字段添加驗證更具有通用性。當相同的驗證邏輯可以應用於多個數據字段時,這是有用的。 。它還允許您執行涉及多個字段的驗證檢查。
但我使用POCO實體框架6班,所以沒有OnValidate
方法重寫,並從我讀這是LinqToSql,我找不到Validate
事件他們提到。
我試圖在我的DbContext的構造函數中訂閱內部ObjectContext
的SavingChanges
事件來手動調用ValidateEntity
,但我不知道如何處理結果。如果我拋出一個DbEntityValidationException
(或者,如this article建議的那樣),ASPNET就像任何異常(黃色屏幕)一樣處理它。
實現IValidatableObject
也不起作用。
我也試圖實現我自己的DynamicValidator
看看會發生什麼,但沒有成功,它似乎處理異常(如果我重寫ValidateException
,並把一個斷點,我看到它),但它仍然向上冒泡到默認錯誤處理程序並顯示一個黃色屏幕。我肯定錯過了什麼。
那麼,如何在保存到動態數據/ EF之前對實體執行復雜驗證(交叉字段,查詢等)?
我同意這個說法,我也相信業務邏輯不應該與實體框架耦合 – Eldho
這是有爭議的。也許一個領域層對象可以有驗證。只要在EF前面沒有使用可怕的'儲存庫層'模式... – James
我同意,但動態數據並沒有提供很多驗證選項。但問題不在於,問題在於DynamicValidator沒有捕獲到DbValidationException(儘管我發現文檔和文章說它應該),所以我得到一個黃色的屏幕。 現在我甚至沒有試圖建立一個良好的架構,只是爲了有一些工作:(。 –