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

简介:

iBatis中,我们面对的通常会是Domain Model,而不是DataSetDataTable。这样在处理业务逻辑时,就可以不必再关心数据持久相关的东东了。

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属性对应表ProductProductId字段,CategoryId对应CategoryId。为了数据的参照完整性,我们可以将CategoryId设置为外键。

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

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

幸好还有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对象作为属性。


本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2007/06/28/ibatisNullableType.html,如需转载请自行联系原作者。

目录
相关文章
|
5月前
|
Java
解决异常 java.net.URISyntaxException: Illegal character in query at index
解决异常 java.net.URISyntaxException: Illegal character in query at index
186 0
JavaFX-MediaPlayer 参数URI格式问题:java.net.URISyntaxException: Illegal character in path at index X
JavaFX-MediaPlayer 参数URI格式问题:java.net.URISyntaxException: Illegal character in path at index X
|
9月前
|
Python
python警告:Workbook contains no default style, apply openpyxl‘s default warn
python警告:Workbook contains no default style, apply openpyxl‘s default warn
|
Java
解决bug:项目配置java8时出现Error:Jack is required to support java 8 language features...
解决bug:项目配置java8时出现Error:Jack is required to support java 8 language features...
243 0
解决bug:项目配置java8时出现Error:Jack is required to support java 8 language features...
DEFAULT keyword in ABAP and Optional Class in Java
DEFAULT keyword in ABAP and Optional Class in Java
DEFAULT keyword in ABAP and Optional Class in Java
|
Java 应用服务中间件 Maven
解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
197 0
解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
|
测试技术
一起谈.NET技术,三种属性操作性能比较:PropertyInfo + Expression Tree + Delegate.CreateDelegate
  在《上篇》中,我比较了三种属性操作的性能:直接操作,单纯通过PropertyInfo反射和IL Emit。本篇继续讨论这个话题,我们再引入另外两种额外的属性操作方式:Expression Tree(这和IL Emit基本一致)和通过Delegate的静态方法CreateDelegate创建相应的委托进行属性的赋值和取值。
856 0
|
C#
一起谈.NET技术,关于C# 中的Attribute 特性
  Attribute与Property 的翻译区别   Attribute 一般译作“特性”,Property 仍然译为“属性”。   Attribute 是什么   Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。
966 0
|
SQL 存储 .NET
一起谈.NET技术,使用LINQ Expression构建Query Object
  这个问题来源于Apworks应用开发框架的设计。由于命令与查询职责的分离,使得基于CQRS体系结构风格的应用系统的外部存储系统的结构变得简单起来:在“命令”部分,简单地说,只需要 Event Store和Snapshot Store来保存Domain Model;而“查询”部分,则又是基于事件派送与侦听的系统集成。
949 0