码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2014-08-11 21:40:55      阅读:421      评论:0      收藏:0      [点我收藏+]

标签:使用   os   io   for   ar   cti   代码   new   

    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

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

标签:使用   os   io   for   ar   cti   代码   new   

原文地址:http://my.oschina.net/MerylLiu/blog/300139

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!