您的位置:首页 > 其它

iBATIS.NET Tips & Tricks(1) : 使用Nullable类型

2007-06-28 20:27 429 查看
在iBatis中,我们面对的通常会是Domain Model,而不是DataSet和DataTable。这样在处理业务逻辑时,就可以不必再关心数据持久相关的东东了。

Domain Model类型的属性常常会对应数据库中表的一个字段(也可能是其它Domain类型的)。比如下面的Product类:

[Serializable]

public partial class Product

{

#region private fields

private int _productid;

private string _productname = String.Empty;

private int _categoryid;

private string _description = String.Empty;

#endregion

#region constructors

public Product() { }

public Product(int productid)

{

this._productid = productid;

}

#endregion

#region Public Properties

public int Productid

{

get { return _productid; }

set { _productid = value; }

}

public string Productname

{

get { return _productname; }

set { _productname = value; }

}

public int CategoryId

{

get { return _categoryid; }

set { _categoryid = value; }

}

public string Description

{

get { return _description; }

set { _description = value; }

}

#endregion

}

ProductId属性对应表Product的ProductId字段,CategoryId对应CategoryId。为了数据的参照完整性,我们可以将CategoryId设置为外键。

这样问题就来了,如果我们通过new
Product()的方式新建一个实例,但没有设置CategoryId的值,那么CategoryId的值实际上为int类型的默认值0,这样在插入数据的时候就会发生外键冲突,因为Category表中不存在主键为0的记录。

另外,如果有类型为DateTime的属性,也会有麻烦。DateTime类型的默认值为0001 年 1 月 1 日午夜 12:00:00,而这不在SQL Server的datetime类型的范围内,在插入数据时也会引发错误。难道我们要手工处理所有这些字段?

幸好还有Nullable类型。如果类型的属性为Nullable类型,那么其默认值将为null。从而省却了上面的烦恼。

我们可将Product类的定义改为:

[Serializable]

public partial class Product

{

#region private fields

private int _productid;

private string _productname = String.Empty;

private int? _categoryid;

private string _description = String.Empty;

#endregion

#region constructors

public Product() { }

public Product(int productid)

{

this._productid = productid;

}

#endregion

#region Public Properties

public int Productid

{

get { return _productid; }

set { _productid = value; }

}

public string Productname

{

get { return _productname; }

set { _productname = value; }

}

public int? CategoryId

{

get { return _categoryid; }

set { _categoryid = value; }

}

public string Description

{

get { return _description; }

set { _description = value; }

}

#endregion

}

注意:实际应用中可能不会使用CategoryId,而是使用Category对象作为属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐