• 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

    希望对大家能有所帮助!

  • 相关阅读:
    VisualSVN-Server windows 版安装时报错 "Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details."
    Pytest 单元测试框架之初始化和清除环境
    Pytest 单元测试框架入门
    Python(email 邮件收发)
    Python(minidom 模块)
    Python(csv 模块)
    禅道简介
    2020年最好的WooCommerce主题
    Shopify网上开店教程(2020版)
    WooCommerce VS Magento 2020:哪个跨境电商自建站软件更好?
  • 原文地址:https://www.cnblogs.com/maplye/p/442322.html
Copyright © 2020-2023  润新知