NHibernate系列之三_流水號

  • 2351
  • 0

摘要:NHibernate系列之三_流水號

在主鍵方面,還有一種很常見的,就是流水號。所有的單據都擺脫不了流水號,如果放棄掉流水號當主鍵,而另外使用替代鍵,然後將流水號降為唯一鍵,雖然設計 上也沒錯,但通常過不了DBA那關。而且,經驗也告訴我們,有時用不用替代鍵是政治問題。所以首先,我們得要接受流水號就是主鍵,而且不想每次去指定流水 號,NHibernate給我們兩種做法。

自定義主鍵產生類別

首先我有一個Invoice類別


 public class Invoice
   {
       public virtual string No { get; set; }
       public virtual decimal Total { get; set; }
   }

Mapping檔設定如下


 
    
      
    

    
  

其中NHPractice.Model.Sequence.InvoiceSequence就是我們自定義的主鍵生成類別


 public class InvoiceSequence : IIdentifierGenerator
  {
      private IDbConnection connection;
      private object synroot = new object();

      object IIdentifierGenerator.Generate(ISessionImplementor session, object obj)
      {
          int newValue;

          //使用Lock
          lock(synroot)
          {
              connection = session.Connection;
              //使用ADO.Net取得序號,再加1回去
              var selectCmd = connection.CreateCommand();
              selectCmd.CommandText = "Select SequenceValue from Sequence where TableName='Invoice'";
              newValue = (int)selectCmd.ExecuteScalar();

              var updateCmd = connection.CreateCommand();
              updateCmd.CommandText = "Update Sequence set SequenceValue =" + (newValue + 1) + " where TableName='Invoice'";
              updateCmd.ExecuteNonQuery();

              return DateTime.Now.ToString("yyyyMMdd") + newValue.ToString("00000000");
          }
      }
  }

Sequence是一個Table,共有兩個欄位。Sequence是記錄每次的累加值,TableName記錄給哪張Table用的。

Before Insert Trigger

NH的主鍵類別中還有一種



      
 

你必須使用Before Insert Trigger,好讓DB生成流水號,NH配合Insert資料,然後取回流水號。只可惜只有Oracle支援。