代码之家  ›  专栏  ›  技术社区  ›  Tigraine

POCO对象中的非空约束

  •  2
  • Tigraine  · 技术社区  · 17 年前

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

    我只是想知道,在没有注释的情况下,我如何在代码中“表达”字段不是null?我有记录这件事的hbm.xml文件,但查看它们来查找类似的东西有点尴尬。

    我想到的另一件事是,我不希望存储库在我的Logic上抛出NHibernate Exceptions,所以也许我应该在Controller中进行验证。 不过,我如何使POCO代码表示某些字段可以为空?

    Class Diagram

    正如你所看到的,我希望手机和传真是可选的,而电话是强制性的。它们都只是复合映射,因此映射文件只是指定每个元素的单个元素必须不为null,但我讨厌使用Person。手机!=始终检查null,以避免出现NullReferenceException。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Justin Davies Justin Davies    17 年前

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

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

        2
  •  1
  •   Jan Limpens Jan Limpens    17 年前

    将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;} 
    }
    
    推荐文章