摘要: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支援。