zoukankan      html  css  js  c++  java
  • 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

    希望对大家能有所帮助!

  • 相关阅读:
    C#获取当前日期时间(转)
    c#截取字符串split各种用法
    c#国际化
    C#密码加密
    c#程序中对密码进行加密的方法
    百度信誉认证体系初级实名认证即将取消,这意味着什么?
    新增利息宝-京东淘宝唯品会自动抢单系统源码搭建过程
    webapp/H5封装,混开APP,没有原生APP好?事实是这样的吗?
    laravel基础laravle中orm简单的增删改查-一颗优雅草男神你姚哥
    Thinkphp二次开发威客RW平台源码详细搭建教程(技术分享帖)-一颗优雅草科技yungui
  • 原文地址:https://www.cnblogs.com/maplye/p/442322.html
Copyright © 2011-2022 走看看