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

POCO对象中的非空约束

  •  1
  • Tigraine  · 技术社区  · 16 年前

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

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

    但是,我如何使POCO代码表示某些字段可以为空?

    Class Diagram

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Justin Davies Justin Davies    16 年前

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

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

        2
  •  1
  •   Jan Limpens Jan Limpens    16 年前

    将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;} 
    }