POCO对象中的非空约束

问题描述:

我目前正在编写一个财务应用程序,并且我们有一个非常标准的客户表。它由许多必填字段和一些可选的单元/传真等组成。我将NHibernate用作ORM并拥有所有的映射。它已经运作。POCO对象中的非空约束

我会想,我怎么“表达”的代码字段是不是空而不评论?我有hbm.xml文件记录了这一点,但看起来像这样的事情有点尴尬。

,想到另一件事是,我不想让存储库在我的逻辑扔NHibernate的异常,所以也许我应该在控制器上的验证路径。 但是,我怎样才能让POCO代码表达一些字段可以为空?

Class Diagram

正如你所看到的,我希望能有蜂窝和传真是可选的,而电话是强制性的。它们都只是复合映射,所以映射文件只是指定每个元素的单个元素都不是null,但我讨厌一直执行Person.Cellular!= null检查以避免产生NullReferenceException。

有这样做取决于你的POCO行为和编码风格的一些方法。首先,您可以使用可为空的类型来表示该字段可以为空,因此隐含的是其余不可空。 或者,您可以引入Phone值类型作为您所示POCO的Phone属性的类型,这意味着因为它不是原始类型,所以它“更重要” - 这也可以使您将电话号码验证封装在课本身。

在我看来,要成为一个真正的POCO对象,它不需要担心数据库表中潜在的可空性......它实际上应该有验证和值类型,它们表现为独立行为实体;因此在它到达NHibernate之前它已经处于有效状态。

+0

我同意这一点。我已经拥有PhoneNumber,因为它是自己的实体,我想在去数据库之前验证它。 我想我会将验证逻辑添加到对象本身。 – Tigraine 2008-11-20 12:44:28

制作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;} 
}