使用NHibernateContrib中的Nullables

在NHibernate做字段映射时,一般会把数据库中的数字类型映射为.Net中的值类型,例如SqlServer中的int映射为Int32类型,如果不给此字段赋值,系统将给出默认值,Int32将给出0,而存到数据库中的值也就成了0。虽然我们可以在读取数据时作出处理,发现这样的值当成不合法的数据不予显示。但这样做似乎有些别扭,而且让数据库白白的存些没有用的数据,实在有些浪费。

NHibernateContrib中的Nullables和Nullables.NHibernate给我们提供了解决方法。

Nullables: A library of Nullable version of the ValueTypes in net-1.1. It is meant to serve as a bridge until .net-2.0 comes out with their own Nullables. Nullables.NHibernate: A library of NHibernate Types for the Nullables.

做个最简单的实验,有个表叫studnets,有三个字段
 [id] [int] IDENTITY (1, 1) NOT NULL ,             //PRIMARY KEY
 [name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [age] [int] NULL

普通方式

using  System;

namespace  NHTest
{
    
///   <summary>
    
///  Student
    
///   </summary>
     public   class  Student
    {
        
public  Student()
        {
        }

        
private   int  m_ID;
        
private   string  m_Name = null ;
        
private   int  m_Age;

        
public   int  ID
        {
            
get
            {
                
return  m_ID;
            }
        }

        
public   string  Name
        {
            
get
            {
                
return  m_Name;
            }
            
set
            {
                m_Name
= value;
            }
        }

        
public   int  Age
        {
            
get
            {
                
return  m_Age;
            }
            
set
            {
                m_Age
= value;
            }
        }
    }
}

<? xml version="1.0" encoding="utf-8"  ?>  
< hibernate-mapping  xmlns ="urn:nhibernate-mapping-2.0" >
    
< class  name ="NHTest.Student,NHTest"  table ="students" >
        
< id  name ="m_ID"  column ="id"   type ="Int32"  unsaved-value ="0"  access ="field" >
            
< generator  class ="native" ></ generator >
        
</ id >
        
< property  name ="Name"  column ="name"  type ="String" ></ property >
        
        
< property  name ="Age"  column ="age"  type ="Int32" ></ property >
        
    
</ class >
</ hibernate-mapping >

使用Nullables
using  System;
using  Nullables.NHibernate;
using  Nullables;

namespace  NHTest
{
    
///   <summary>
    
///  允许age为Nullables的Student
    
///   </summary>
     public   class  StudentN
    {
        
public  StudentN()
        {
        }

        
private   int  m_ID = 0 ;
        
private   string  m_Name = null ;
        
private  NullableInt32 m_Age = null ;

        
public   int  ID
        {
            
get
            {
                
return  m_ID;
            }
        }

        
public   string  Name
        {
            
get
            {
                
return  m_Name;
            }
            
set
            {
                m_Name
= value;
            }
        }

        
public  NullableInt32 Age
        {
            
get
            {
                
return  m_Age;
            }
            
set
            {
                m_Age
= value;
            }
        }
        
    }
}
<? xml version="1.0" encoding="utf-8"  ?>  
< hibernate-mapping  xmlns ="urn:nhibernate-mapping-2.0" >
    
< class  name ="NHTest.StudentN,NHTest"  table ="students" >
        
< id  name ="m_ID"  column ="id"   type ="Int32"  unsaved-value ="0"  access ="field" >
            
< generator  class ="native" ></ generator >
        
</ id >
        
< property  name ="Name"  column ="name"  type ="String" ></ property >
        
        
< property  name ="Age"  column ="age"  type ="Nullables.NHibernate.NullableInt32Type,Nullables.NHibernate" ></ property >
        
    
</ class >
</ hibernate-mapping >


我的测试代码如下
using  System;
using  System.Data;
using  System.Data.SqlClient;
using  System.Collections;

using  NUnit.Framework;
using  NHibernate;
using  NHibernate.Cfg;

namespace  NHTest
{
    [TestFixture]
    
public   class  TestCase
    {
        [SetUp]
        
public   void  SetUp()
        {
    
        }
    
        [TearDown]
        
public   void  TearDown()
        {
            SqlConnection con
= new  SqlConnection();
            con.ConnectionString
= " server=.;database=NHTest;uid=sa;pwd=sa; " ;
            SqlCommand cmd
= new  SqlCommand();
            cmd.Connection
= con;
            cmd.CommandText
= " delete from students " ;                // 清空数据库
             try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }
            
finally
            {
                con.Close();
            }
        }


        [Test]
        
public   void  TestStudentN()
        {
            Configuration cfg
= new  Configuration().Configure();         // 直接读取hibernate.cfg.xml中的配置
            ISessionFactory factory = cfg.BuildSessionFactory();
            ITransaction tran
= null ;
            
try
            {
                ISession session
= factory.OpenSession();
                tran
= session.BeginTransaction();

                StudentN newStudent
= new  StudentN();
                newStudent.Name
= " DDL " ;               // 没有给newStudent设置Age
                session.Save(newStudent);
                tran.Commit();
            }
            
catch (Exception ex)
            {
                tran.Rollback();
                
throw  ex;
            }

            ISession session1
= factory.OpenSession();
            IList lists
= session1.Find( " from StudentN S where S.Name='DDL' " );

            Assert.AreEqual(
1 ,lists.Count, " 名为DDL的学生没有找到 " );

            StudentN student
= (StudentN)lists[ 0 ];

            Assert.AreEqual(
" DDL " ,student.Name, " 没找到名为LLY的student " );
            
// Assert.AreEqual(student.Age,null);              // 学生的Age不为null,不过Age的HasValue属性为false
            Assert.IsFalse(student.Age.HasValue, " Age有值 " );
        }

        [Test]
        
public   void  TestStudent()                 
        {
            Configuration cfg
= new  Configuration().Configure();     // 直接读取hibernate.cfg.xml中的配置
            ISessionFactory factory = cfg.BuildSessionFactory();
            ITransaction tran
= null ;
            
try
            {
                ISession session
= factory.OpenSession();
                tran
= session.BeginTransaction();

                Student newStudent
= new  Student();
                newStudent.Name
= " LLY " ;                // 没有给newStudent设置Age
                session.Save(newStudent);
                tran.Commit();
            }
            
catch (Exception ex)
            {
                tran.Rollback();
                
throw  ex;
            }

            ISession session1
= factory.OpenSession();
            IList lists
= session1.Find( " from Student S where S.Name='LLY' " );

            Assert.AreEqual(
1 ,lists.Count, " 名为LLY的学生没有找到 " );

            Student student
= (Student)lists[ 0 ];

            Assert.AreEqual(
" LLY " ,student.Name, " 没找到名为LLY的student " );
            Assert.AreEqual(
0 ,student.Age, " 学生年龄没有设置默认值0 " );
        }
    }
}

转载于:https://www.cnblogs.com/renrenqq/archive/2005/09/05/230623.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值