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对象作为属性。
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对象作为属性。
相关文章推荐
- iBATIS.NET Tips & Tricks(1) : 使用Nullable类型
- iBATIS.NET Tips & Tricks(2) : 将image列设置为null值时遇到的Operand type clash异常。
- iBATIS.NET Tips & Tricks(2) : 将image列设置为null值时遇到的Operand type clash异常。
- ASP.NET AJAX Advance Tips & Tricks (10) 解决使用AJAX Extender时的页面导出(Word/Excel)问题(Extender control 'XXX'
- ASP.NET AJAX Advance Tips & Tricks (10) 解决使用AJAX Extender时的页面导出(Word/Excel)问题(Extender control 'XXX' is not a registered extender control)
- Tips and Tricks for the Visual Studio .NET IDE
- Visual Studio .NET Tips and Tricks
- 《Visual Studio.NET Tips and Tricks》一书翻译下载
- ASP.NET AJAX Advance Tips & Tricks (3) JavaScript与Tab的交互
- 26个Jquery使用小技巧(jQuery tips, tricks & solutions)
- ASP.NET AJAX Advance Tips & Tricks (1) CascadingDropDown在IE和Safari中的一个缺陷和解决方法
- 极品Visual Studio 快捷键 使用贴士汇总--- Awesome Tips/Tricks with Visual Studio
- 小tips:asp.net 2.0中在gridview中使用DataFromatString
- 26个Jquery使用小技巧(jQuery tips, tricks & solutions)
- 26个Jquery使用小技巧(jQuery tips, tricks & solutions)
- 26 个 JQuery 使用小技巧(jQuery tips, tricks & solutions)
- 使用IBatisNet + Castle 开发DotNet软件
- The ASP.NET 2.0 Anthology: 101 Essential Tips, Tricks & Hacks [ILLUSTRATED]
- 小tips:asp.net 2.0中在gridview中使用DataFromatString
- ASP.NET AJAX Advance Tips & Tricks (4) ASP.NET AJAX Performance Improvement