Recuperar informações do Mapeamento

27 views
Skip to first unread message

Silvagpe

unread,
Sep 30, 2014, 3:08:28 PM9/30/14
to nhiber...@googlegroups.com
Boa Tarde Pessoal,

Estou precisando recuperar as informações de um mapeamento, como por exemplo.
Propriedades  = Colunas
Propriedades Chave  = Identificador.

Vamos ao exemplo

A Entidade
public class PES_ClientesTelefones: Entidade, IEntidade
    {
        public virtual long Clf_Id { get; set; }

        public virtual long Clf_Tpf_Id { get; set; }

        public virtual long Clf_Cli_Id { get; set; }

        public virtual string Clf_Numero { get; set; }

        public virtual string Clf_Area { get; set; }

        public virtual string Clf_Ramal { get; set; }

        public virtual string Clf_Complemento { get; set; }

        public virtual DateTime? Clf_Dtultalt { get; set; }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }

        public override int GetHashCode()
        {
            return this.Clf_Id.GetHashCode() ^ this.Clf_Cli_Id.GetHashCode();
        }
    }

O Mapeamento
 public class PES_ClientestelefonesMap : ClassMap<PES_ClientesTelefones>
    {
        public PES_ClientestelefonesMap()
        {
            Table("clientestelefones");
          
            CompositeId().KeyProperty(x => x.Clf_Id, "clf_id").KeyProperty(x => x.Clf_Cli_Id, "clf_cli_id");
          
            Map(x => x.Clf_Tpf_Id, "clf_tpf_id").Not.Nullable();
            Map(x => x.Clf_Numero, "clf_numero").Length(20);
            Map(x => x.Clf_Area, "clf_area").Length(10);
            Map(x => x.Clf_Ramal, "clf_ramal").Length(10);
            Map(x => x.Clf_Complemento, "clf_complemento").Length(60);
            Map(x => x.Clf_Dtultalt, "clf_dtultalt");
        }
    }


Bom até aqui tudo normal.

Eu consigo recuperar as colunas mapeadas com Map() e o nome da tabela porém as propriedade que referenciam a CompositeID não.
Eu consigo as colunas mas não o vinculo com a propriedade da classe.



Retorna as propriedades

public static IEnumerable<PropertyInfo> GetProperties(this ISessionFactory sessionFactory, Type entityType)
        {
            String entityName = (sessionFactory as ISessionFactoryImplementor).TryGetGuessEntityName(entityType);
            IClassMetadata metadata = sessionFactory.GetClassMetadata(entityName);

            for (Int32 i = 0; i < metadata.PropertyTypes.Length; ++i)
            {
                IType property = metadata.PropertyTypes[i];

                if (!(property is OneToOneType) && !(property is ManyToOneType) && !(property is ComponentType))
                {
                    String propertyName = metadata.PropertyNames[i];
                    yield return (entityType.GetProperty(propertyName));
                }
            }
        }


Retorna a coluna da propriedade
public static String GetColumnName(this ISessionFactory sessionFactory, Type entityType, String propertyName)
        {
            String entityName = (sessionFactory as ISessionFactoryImplementor).TryGetGuessEntityName(entityType);
            AbstractEntityPersister persister = (sessionFactory as ISessionFactoryImplementor).TryGetEntityPersister(entityName) as AbstractEntityPersister;

            if (persister != null)
            {
                return (persister.GetPropertyColumnNames(propertyName).SingleOrDefault());
            }
            else
            {
                return (null);
            }

        }

Nome da Tabela
public static String GetTableName(this ISessionFactory sessionFactory, Type entityType)
        {
            String entityName = (sessionFactory as ISessionFactoryImplementor).TryGetGuessEntityName(entityType);
            AbstractEntityPersister persister = (sessionFactory as ISessionFactoryImplementor).TryGetEntityPersister(entityName) as AbstractEntityPersister;

            if (persister != null)
            {
                return (persister.TableName);
            }
            else
            {
                return (null);
            }

        }


Mas vocês vão perceber que as propriedades da CompositeID "Clf_Id" e "Clf_Cli_Id" não retornam em nenhum lugar.

Em anexo uma a imagem do QuickWatcher


Alguma sugestão?

Ps. o motivo é que preciso gerar sentenças SQL e gravar em uma tabela de logs (Exigência do cliente)

Já testei implementando o NHibernate.IInterceptor até consegui  recuperar o SQL, porém sem valores e mesmo que consiga recuperar o SQL ainda precisa passar por tratamento não posso gravar o SQL puro em banco.
Então a melhor solução era criar uma classe de integração que receberá a entidade após ser salva identificar as informações e gerar "manualmente" as sentenças SQL (apenas as que interessam)


Obrigado pela atenção.

At.
Rafael

nh_propriedades.png

Silvagpe

unread,
Sep 30, 2014, 3:48:30 PM9/30/14
to nhiber...@googlegroups.com
Só para constar consegui.

Segue o código para recuperar as propriedades quando for um CompositeID


public static IList<PropertyInfo> GetIdentifier(this ISessionFactory sessionFactory, Type entityType)
        {
            IList<PropertyInfo> properties = new List<PropertyInfo>();


            String entityName = (sessionFactory as ISessionFactoryImplementor).TryGetGuessEntityName(entityType);
            AbstractEntityPersister persister = (sessionFactory as ISessionFactoryImplementor).TryGetEntityPersister(entityName) as AbstractEntityPersister;

            if (persister == null)
                return properties;

            if (persister.IdentifierPropertyName != null)
            {
                properties.Add(entityType.GetProperty(persister.IdentifierPropertyName));

                return properties;
            }

            if (persister.IdentifierType is IAbstractComponentType)
            {
                IAbstractComponentType componentId = (IAbstractComponentType)persister.IdentifierType;

                foreach (string name in componentId.PropertyNames)
                {
                    properties.Add(entityType.GetProperty(name));
                }
            }

            return properties;
        }
Reply all
Reply to author
Forward
0 new messages