2011-04-19 81 views
7

我使用實體框架是第一次,我需要插入新對象到數據庫之前添加業務邏輯,這裏是我想過的選項:最佳實踐,以實現業務邏輯的驗證 - 實體框架

通過在實現驗證層的自定義類使用OnPropertyChanging局部方法
  • 裹所生成的代碼重寫SaveChanges方法
  • 實現業務邏輯爲每個實體 -
    1. 實現對DataContext的級別的業務邏輯。

    對實體框架管理業務邏輯時

  • +0

    什麼版本的EF您使用的是? – 2011-04-19 13:58:30

    +0

    實體框架版本4.1 – Mark 2011-04-19 14:00:32

    +0

    好。您可以輕鬆創建POCO,我使用的鏈接是一個很好的起點。這是最接近選項3. – 2011-04-19 14:09:44

    回答

    7

    看看validation with EF - 驗證是在實體內部進行的。

    這是一個非常乾淨的方式來組織您的項目。

    當您有POCO s時,實體驗證的明顯位置在POCO本身中。

    有意義的是,Customer對象的任何驗證實際上都在Customer類中。

    +0

    鏈接已經死機 – 2016-10-29 07:03:13

    +0

    @ B413 - 謝謝,我已經更新了答案。 – 2016-10-31 18:16:28

    0

    另一種方式要考慮的是完全組件化你的數據訪問層完全來自業務邏輯層。

    創建一個只能直接訪問實體框架的數據訪問接口,然後在一個單獨的項目中,我將創建您的業務邏輯類,它通過接口與數據訪問層進行交互。您的業​​務邏輯項目中沒有實體框架參考。

    通過這種方式,這些圖層被組件化,並且更易於作爲用於兩層或三層訪問的多個程序集進行分發。

    +0

    這聽起來我真的很期待,請你添加更多關於如何綁定這兩個組件的解釋(實體 - 業務邏輯) – Mark 2011-04-19 13:59:09

    +0

    我的空間不足以前的評論,但是我的業務邏輯層類將以相同的方式並在他們自己的名稱空間中構建。典型地,我把自定義操作,驗證以及其他一切都放在這裏。您的業​​務邏輯類可以使用必要的數據訪問接口。你可以更進一步,將你的圖層分離成獨立的項目和組件,但這可能會過度。 BL類接口的好處是可以直接通過Web服務或直接通過WPF訪問它們。它靈活且組件化。 – 2011-04-19 14:23:35

    +0

    非常感謝您 – Mark 2011-04-19 17:32:51

    5

    我的經驗:

    1. 這工作,但它是相當不少,其中必須驗證這可以慢許多實體的情況下工作,。其實EFv4.1會自動完成此操作。
    2. 我不喜歡這種方式 - 它只服務於單個屬性更改,不適用於需要在獲取有效狀態之前修改多個屬性的複雜驗證。
    3. 也許 - 我喜歡根據需求進行驗證。每個實體都可以暴露Validate方法來檢查整個實體的狀態是否正確。

    但是,只有您總是使用整個實體,所有這些纔有效。一旦開始使用部分更新和其他功能,您仍然需要在別處處理驗證。這是另一個用於驗證需求的+1。

    +0

    我同意,您使用哪種替代方案來解決您的問題? – 2016-01-21 17:46:08

    1

    我更喜歡數字3的一個版本。我喜歡抽象實體框架using a repository或類似的東西,以防我將來/需要替換EF。然後對於驗證/業務邏輯,我使用任何驗證技術對應用程序有意義,但通常是DataAnnotations(用於UI最小驗證)和驗證框架(如Fluent Validation)的最大驗證/業務規則的組合。這個驗證/業務邏輯同時存在於實體類(DataAnnotations)和抽象層中,這通常是我的應用程序中的一個服務層。

    0

    您可以通過創建另一個部分類定義來擴展您的類,大多數EF模板將實體定義爲僅供人們輕鬆擴展它們的部分定義。如果你正在使用WPF或Silverlight,因爲大多數東西不是直接綁定的,你可能想要這樣做,你可能有一個布爾值並想將其轉換爲顏色等。編寫轉換器速度很慢,需要更多的代碼然後在您的BusinessObjects上創建新的Getter。

    我們一直在使用EF 4.0 STE(Self Tracking Entities)一段時間,並且我們用自己的部分定義擴展了大部分。我們改變了一些創建STE的T4模板,以允許訪問自定義部分類定義上的構造函數以及其他小改進。