none
NHibernate, salvar dados string em UpperCase RRS feed

  • Pergunta

  • Galera, alguem sabe como eu posso estar salvando dados string em uppercase no nhibernate, sem ter que ficar fazendo isso a cada string que eu for salvar no banco?
    Davi Nogueira
    quarta-feira, 4 de novembro de 2009 18:18

Todas as Respostas

  • Crie a seguinte classe no mesmo assembly que tem suas entidades:
    public class UpperString : IUserType
        {
            public UpperString()
            {
            }
    
            #region IUserType Members
    
            public new bool Equals(object x, object y)
            {
                bool returnvalue = false;
                if ((x != null) && (y != null))
                {
                    returnvalue = x.Equals(y);
                }
                return returnvalue;
            }
    
            public NHibernate.SqlTypes.SqlType[] SqlTypes
            {
                get
                {
                    NHibernate.SqlTypes.SqlType[] types = { NHibernate.SqlTypes.SqlTypeFactory.GetString(255) };
                    return types;
                }
            }
    
            public Type ReturnedType
            {
                get
                {
                    return typeof(String);
                }
            }
    
            /// <summary>
            /// Takes care of null values.
            /// </summary>
            public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)
            {
                object value = rs.GetValue(rs.GetOrdinal(names[0]));
                if (value == DBNull.Value)
                {
                    return String.Empty;
                }
                return value;
            }
    
            /// <summary>
            /// Faz o UpperCase na sua string sempre que for setar o valor
            /// </summary>
            public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
            {
                if (Convert.ToString(value) == String.Empty)
                {
                    ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value;
                }
                else
                {
                    //faz o upper
                    ((IDataParameter)cmd.Parameters[index]).Value = ((string)value).ToUpper();
                }
            }
    
            public object DeepCopy(object value)
            {
                return value;
            }
        
            public bool IsMutable
            {
                get { return true; }
            }
    
            public object Assemble(object cached, object owner)
            { return DeepCopy(cached); }
    
            public object Disassemble(object value)
            { return value; }
    
            public int GetHashCode(object x)
            { return x.GetHashCode(); }
    
            public object Replace(object original, object target, object owner)
            { return original; }
    
            #endregion
        }
    Depois altere o mapeamento das suas entidades nas colunas que você quer que sempre sejam UpperCase conforme o exemplo:

    <property length="24" name="PropriedadeUpper" column="ColunaUpper">
              <type name="MeuAssembly.NHUserTypes.UpperString, MeuAssembly">
              </type>
    </property>
    E aí pronto... O que vc acabou de criar foi um UserType do hibernate. Agora todas as propriedades string que você mapear como UpperString serão colocadas em caixa alta através do método NullSafeGet da classe UpperString.

    Abraços

    --

    Se resolveu, marque como resposta.
    quinta-feira, 5 de novembro de 2009 11:24
  • Desculpe a demora, mais vou tentar essa abordagem.

    Apesar de eu estar usando o Castle ActiveRecord, que usa o NHibernate por debaixo dos panos, vou tentar essa dica que vc me passou.

    Valeu

    Davi Nogueira
    quinta-feira, 12 de novembro de 2009 21:36