NHiernate中自定义Generator

我的这个自定义的Generator设置如下:

<generator class="HYLQ.Core.Domain.StreamGenerator, HYLQ.Core">
        
<param name="ObjectName">Child</param>
      
</generator>
这样我会为每个ObjectName都会产生一个顺序的流水号。
StreamGenerator的代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using NHibernate.Id;
using NHibernate.Engine;
using NHibernate.SqlCommand;
using NHibernate.SqlTypes;
using NHibernate.Type;
using NHibernate.Util;
using NHibernate.Dialect;
using NHibernate.Mapping;

namespace HYLQ.Core.Domain
{
    
class StreamGenerator : IPersistentIdentifierGenerator, IConfigurable
    
{


        
/// <summary></summary>
        public const string ObjectNameTarget = "ObjectName";

        
public const string procNameTarget = "ProcedureName";

        
private string objectName;
        
private string procName = "usp_GetID";
        
private long next;

        
private System.Type returnClass;

        
/// <summary>
        
///
        
/// </summary>
        
/// <param name="type"></param>
        
/// <param name="parms"></param>
        
/// <param name="d"></param>


        
public void Configure(IType type, IDictionary parms, Dialect d)
        
{
            objectName 
= parms[ObjectNameTarget] as string;

            
if (parms[procNameTarget] != null)
            
{
                procName 
= parms[procNameTarget] as string;
            }


            returnClass 
= type.ReturnedClass;
        }


        
/// <summary>
        
///
        
/// </summary>
        
/// <param name="session"></param>
        
/// <param name="obj"></param>
        
/// <returns></returns>

        [MethodImpl(MethodImplOptions.Synchronized )]
        
public object Generate(ISessionImplementor session, object obj)
        
{
            
if (objectName != null)
            
{
                getNext(session);
            }

            
return IdentifierGeneratorFactory.CreateNumber(next, returnClass);
        }


        
private void getNext(ISessionImplementor session)
        
{

            SqlConnection conn 
= (SqlConnection)session.Factory.OpenConnection();
            SqlCommand qps 
= conn.CreateCommand();
            qps.CommandText 
= procName;
            qps.CommandType 
= CommandType.StoredProcedure;
            qps.Parameters.Add(
new SqlParameter("@ObjectName", SqlDbType.VarChar,10));
            qps.Parameters[
"@ObjectName"].Value = objectName;

            
try
            
{
                next 
= int.Parse(qps.ExecuteScalar().ToString());
                
            }

            
catch 
            
{
                
throw;
            }

            
finally
            
{
                session.Factory.CloseConnection( conn );
            }

        }


        
/// <summary>
        
///
        
/// </summary>
        
/// <param name="dialect"></param>
        
/// <returns></returns>

        public string[] SqlCreateStrings(Dialect dialect)
        
{
            
return new string[0];
        }


        
/// <summary>
        
///
        
/// </summary>
        
/// <param name="dialect"></param>
        
/// <returns></returns>

        public string SqlDropString(Dialect dialect)
        
{
            
return null;
        }


        
/// <summary></summary>
        public object GeneratorKey()
        
{
            
return objectName;
        }

    }

}

这里是调用一个存储过程来生成流水号的。
存储过程和表的定义如下:
--流水号
create table Stream
(
    ObjectName        
varchar(10)        not null,        --对象名
    MaxID            int                not null,        --流水号
    primary key(ObjectName)
)
go

--流水号发生器
if exists(select * from sysobjects where type='p' and name='usp_GetID')
    
drop proc usp_GetID
go
create proc usp_GetID
(
    
@ObjectName        varchar(10)            --对象名
)
as
begin
    
declare @MaxID int
    
SET NOCOUNT ON

    
if exists(select * from Stream where ObjectName=@ObjectName)
    
begin
        
select @MaxID=MaxID from Stream where ObjectName=@ObjectName
        
update Stream set MaxID=MaxID+1 where ObjectName=@ObjectName
    
end
    
else
    
begin
        
set @MaxID=1
        
insert into Stream values(@ObjectName,2)
    
end
    
    
select @MaxID as MaxID
end
go

希望对大家能有所帮助!

posted @ 2006-07-04 13:50  福娃  阅读(1674)  评论(3编辑  收藏  举报