NHibernate 的 SetResultTransformer 方法在Oracle下的Bug修复

NHibernate 的 SetResultTransformer 方法在Oracle下会出现“Could not find a setter for property”错误,这是Nhibernate在Oracle下使用的一个Bug。针对此Bug我可以自己进行修复。

下载NHibernate源码,将Property下的“ChainedPropertyAccessor.cs”稍作修改就会修复此Bug,代码如下:

using System;

namespace NHibernate.Properties
{
    using System.Text.RegularExpressions;

    [Serializable]
    public class ChainedPropertyAccessor : IPropertyAccessor
    {
        private readonly IPropertyAccessor[] chain;

        public ChainedPropertyAccessor(IPropertyAccessor[] chain)
        {
            this.chain = chain;
        }

        #region IPropertyAccessor Members

        public IGetter GetGetter(System.Type theClass, string propertyName)
        {
            for (int i = 0; i < chain.Length; i++)
            {
                IPropertyAccessor candidate = chain[i];
                try
                {
                    return candidate.GetGetter(theClass, propertyName);
                }
                catch (PropertyNotFoundException)
                {
                    // ignore
                }
            }
            throw new PropertyNotFoundException(theClass, propertyName, "getter");
        }

        public ISetter GetSetter(System.Type theClass, string propertyName)
        {
            for (int i = 0; i < chain.Length; i++)
            {
                IPropertyAccessor candidate = chain[i];
                try
                {
                    return candidate.GetSetter(theClass, ToModelName(propertyName));
                }
                catch (PropertyNotFoundException)
                {
                    //
                }
            }
            throw new PropertyNotFoundException(theClass, propertyName, "setter");
        }

        public bool CanAccessThroughReflectionOptimizer
        {
            get { return false; }
        }

        #endregion

        private static string ToModelName(string str)
        {
            str = str.ToLower();
            var temp = Regex.Replace(str, @"_[a-z]?",m=>m.ToString().Substring(1).ToUpper());
            var result = Regex.Replace(temp, @"^[a-z]?", m => m.ToString().ToUpper());

            return result;
        }
    }
}

NHibernate 的 SetResultTransformer 方法在Oracle下的Bug修复,布布扣,bubuko.com

时间: 2024-10-28 14:37:49

NHibernate 的 SetResultTransformer 方法在Oracle下的Bug修复的相关文章

oracle下导出某用户所有表的方法

scott/tiger是用户名和密码,handson是导出的实例名 按用户方式导出数据(owner当中写的是用户名) exp scott/[email protected] file=scott_back owner=scott 按表方式导出数据(talbes当中写的是全部表的名称) exp scott/[email protected] tables=(emp, dept) file=scott_back_tab 按表空间方式导出数据(tablespaces当中写的是表空间名称) exp sy

oracle下正确删除表空间的方法

Oracle因为本身的多重验证机制所有在删除表空间时不像MySQL中删除database一样,可以通过外部的删除直接删除掉database文件夹就可以删除掉database,当然这两者是2种不同的东西,在此仅用于举例说明.在Oracle中表空间相当于系统中的硬盘,Oracle可以通过修改配置表空间来对Oracle下的数据进行存储,所以在Oracle下表空间是非常重要的,尤其是在表空间文件处理不当都会造成Oracle的不稳定,在此就说一说如何正确的删除Oracle的表空间. 删除表空间时,需要确定

createSQLQuery的addEntity跟setResultTransformer方法

createSQLQuery的addEntity和setResultTransformer方法 1. 使用SQLQuery对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.最简单的情况下,我们可以采用以下形式: List cats = sess.createSQLQuery( " select * from cats " ).addEntity(Cat. class ).list(); 这个查询指定了: S

下载Grid方法(Oracle RAC)

如何下载RAC所需的grid软件 注册账户后登陆OTN网站 到下载选项处找到"服务器和存储系统"项 下拉菜单找到,Grid Infrastructure 进入后,记得点击"接受许可"才可以从OTN下载软件 点击允许后,如下图所示: 下拉菜单,找到你所需要的软件包,如下图所示: ***********************************************声明***********************************************

Oracle下ORA-00119错误的解决

Oracle在修改参数后启动时报下列错误 [email protected] >startupORA-00119: invalid specification for system parameter DISPATCHERSORA-00111: invalid attribute DISPPATCHERS 解决方法 1.创建pfile [email protected] >create pfile from spfile; File created. 2.修改pfile [[email pro

oracle下常用的系统表和系统视图

此处,在此列出一些Oracle下常用的视图,用于查询Oracle下的一些配置属性,要注意的是在select的时候要在DBA的用户下,不然是没有权限调阅这些表和视图. ----------DBA_ Dba_Tab_Comments   表注释      Dba_Col_Comments 列注释 DBA_2PC_NEIGHBORS                包含待处理事务进入连接和退出连接信息. DBA_2PC_PENDING                 包含等待恢复的分布式事务的信息. D

【方法】Oracle用户密码含特殊字符时的登陆问题

[方法]Oracle用户密码含特殊字符时的登陆问题 1.1  BLOG文档结构图 1.2.2  相关文章链接 [密码]Oracle用户密码系列:http://blog.itpub.net/26736162/viewspace-2129595/ ------------------------------------------------------------------------- 第二章 实验部分 2.1  实验环境介绍 项目 source db db 类型 RAC db version

获得执行计划方法-一 ORACLE AUTOTRACE

ORACLE sql trace AUTOTRACE 命令 1 SET AUTOTRACE OFF                   此为默认值,即关闭Autotrace2 SET AUTOTRACE ON                    产生结果集和解释计划并列出统计3 SET AUTOTRACE ON EXPLAIN            显示结果集和解释计划不显示统计4 SETAUTOTRACE TRACEONLY              显示解释计划和统计,尽管执行该语句但您将

Navicat 用什么方法检测 Oracle 数据库安全性

Navicat for Oracle 作为一套超强的Oracle数据库系统管理工具.它可以在Oracle数据库8i以上的版本中运行,并支持其大部分最新功能.并且帮助Oracle新手们快速的学习掌握使用方法.一些用户对Navicat 用什么方法检测 Oracle 数据库安全性比较疑惑,下面我们就来针对这个问题来给大家分享一下. Navicat 用户 除了用户创建的帐号,数据库包括在安裝时自动创建数个用户管理帐号,即 SYS.SYSTEM.SYSMAN 和DBSNMP.管理帐号是有较高权限的帐号,可