2008-11-20 60 views
1

我目前正在編寫一個財務應用程序,並且我們有一個非常標準的客戶表。它由許多必填字段和一些可選的單元/傳真等組成。我將NHibernate用作ORM並擁有所有的映射。它已經運作。POCO對象中的非空約束

我會想,我怎麼「表達」的代碼字段是不是空而不評論?我有hbm.xml文件記錄了這一點,但看起來像這樣的事情有點尷尬。

,想到另一件事是,我不想讓存儲庫在我的邏輯扔NHibernate的異常,所以也許我應該在控制器上的驗證路徑。 但是,我怎樣才能讓POCO代碼表達一些字段可以爲空?

Class Diagram

正如你所看到的,我希望能有蜂窩和傳真是可選的,而電話是強制性的。它們都只是複合映射,所以映射文件只是指定每個元素的單個元素都不是null,但我討厭一直執行Person.Cellular!= null檢查以避免產生NullReferenceException。

回答

1

有這樣做取決於你的POCO行爲和編碼風格的一些方法。首先,您可以使用可爲空的類型來表示該字段可以爲空,因此隱含的是其餘不可空。 或者,您可以引入Phone值類型作爲您所示POCO的Phone屬性的類型,這意味着因爲它不是原始類型,所以它「更重要」 - 這也可以使您將電話號碼驗證封裝在課本身。

在我看來,要成爲一個真正的POCO對象,它不需要擔心數據庫表中潛在的可空性......它實際上應該有驗證和值類型,它們表現爲獨立行爲實體;因此在它到達NHibernate之前它已經處於有效狀態。

+0

我同意這一點。我已經擁有PhoneNumber,因爲它是自己的實體,我想在去數據庫之前驗證它。 我想我會將驗證邏輯添加到對象本身。 – Tigraine 2008-11-20 12:44:28

1

製作NOTNULL屬性只讀,並通過公共構造寫信給他們。使默認的構造函數受保護或不公開。

public class DomainObject{ 
private string nnp; 
protected DomainObject(){} 
public DomainObject(string nnp){ 
this.nnp = nnp; 
} 
public string NotNullProp {get {return nnp;}} 
public string NullableProp {get;set;} 
} 
相關問題