2

我目前正在编写一个财务应用程序,我们有一个非常标准的客户表。它由许多必填字段和一些可选字段组成,例如 Cell/Fax 等。我使用 NHibernate 作为 ORM 并且所有映射都正确。它已经起作用了。

我只是想知道,我如何在代码中“表达”一个字段不为空而不注释?我有记录这个的 hbm.xml 文件,但是对于这样的事情来看它们有点尴尬。

想到的另一件事是我不希望存储库在我的逻辑上抛出 NHibernate 异常,所以也许我应该在控制器中进行验证。不过,我怎样才能让 POCO 代码表达某些字段可以为空?

类图

如您所见,我希望蜂窝和传真是可选的,而电话是必需的。它们都只是复合映射,所以映射文件只是指定每个元素的单个元素必须不为空,但我讨厌一直执行 Person.Cellular != null 检查以避免出现 NullReferenceException。

4

2 回答 2

1

根据您的 POCO 行为和编码风格,有几种方法可以做到这一点。首先,您可以使用可空类型来表示该字段可以为空,因此暗示其余字段不可为空。或者,您可以引入 Phone 值类型作为您说明的 POCO 的 Phone 属性的类型,这意味着因为它不是原始类型,所以它“更重要” - 这也将使您能够在类中封装电话号码验证本身。

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

于 2008-11-20T12:28:27.860 回答
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;} 
}
于 2008-11-28T23:58:42.227 回答