Erro ao retornar JSON com WCF e FluentNhibernate

.NET

03/12/2012

Quando uso classes com referencia dá um erro e não retorna nada.

[DataContract]
    public class Cidade
    {
        [DataMember]
        public virtual int Id { get; set; }

        [DataMember]
        public virtual Estado Estados { get; set; }

        [DataMember]
        public virtual string Nome { get; set; }

        [DataMember]
        public virtual int? Codigo_ibge { get; set; }

        [DataMember]
        public virtual int? Codigo_receita_federal { get; set; }

        [DataMember]
        public virtual int? Codigo_estadual { get; set; }

        [DataMember]
        public virtual char Ativo { get; set; }        
    }

[DataContract]
    public class Estado
    {        
        [DataMember]
        public virtual int Id { get; set; }

        [DataMember]
        public virtual string Sigla { get; set; }

        [DataMember]
        public virtual string Nome { get; set; }

        [DataMember]
        public virtual int Codigo_ibge { get; set; }

        [DataMember]
        public virtual char Ativo { get; set; }

        [DataMember]
        public virtual IList<Cidade> Cidade { get; set; }

        public Estado()
        {
            this.Cidade = new List<Cidade>();
        }
    }

public class EstadoMap : ClassMap<Estado>
    {
        public EstadoMap()
        {
            Id(e => e.Id);
            Map(e => e.Sigla);
            Map(e => e.Nome);
            Map(e => e.Codigo_ibge);
            Map(e => e.Ativo);
            HasMany(e => e.Cidade).KeyColumn("id_uf");
            Table("estado");
        }
    }

public class CidadeMap : ClassMap<Cidade>
    {
        public CidadeMap()
        {
            Id(e => e.Id);
            Map(e => e.Nome);
            Map(e => e.Codigo_receita_federal);
            Map(e => e.Codigo_ibge);
            Map(e => e.Codigo_estadual);
            Map(e => e.Ativo);
            References(e => e.Estados).Column("id_uf");
            Table("cidade");
        }
    }

Interface:

[OperationContract]
        [WebGet(UriTemplate = "/RetornarTodasCidades", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        IList<Cidade> RetornarTodasCidades();


public IList<Cidade> RetornarTodasCidades()
        {
            using (ISession session = FluentSessionFactory.AbrirSession())
            {
                try
                {
                    return (from t in session.Query<Cidade>() where t.Ativo.Equals('S') select t).ToList();                     
                }
                catch (Exception ex)
                {                    
                    throw ex; 
                }
            }
        }
Thiago Porto

Thiago Porto

Curtidas 0

Melhor post

Renato Groffe

Renato Groffe

04/12/2012

Thiago,


Bom dia,

Qual é exatamente a exceção que está sendo retornada?


Renato
GOSTEI 1

Mais Respostas

Thiago Porto

Thiago Porto

03/12/2012

Como executo pelo navegador não consigo visualizar um erro, apenas mostra que não conseguiu carregar a página, se eu comentar os relacionamentos entre as tabelas estado e cidade e sues respectivos mapeamentos funcionar normal, trazendo todas as cidades.
GOSTEI 1
Renato Groffe

Renato Groffe

03/12/2012

Thiago,


Nas ocasiões em que utilizei o Fluent NHibernate, eu não montei classes com relacionamentos.

Mas acredito que o problema esteja acontecendo pelo fato de não existir uma propriedade de nome "id_uf" na sua classe Cidade. É provável que isso esteja ocasionando este problema.

Segue um link que comenta sobre isso:

[url]http://stackoverflow.com/questions/9761154/fluent-nhibernate-mapping-hasmany[/url]
GOSTEI 1
Thiago Porto

Thiago Porto

03/12/2012

vou testar...
GOSTEI 1
Renato Groffe

Renato Groffe

03/12/2012

Outra sugestão para testar o que realmente acontece seria vc debugar o serviço ou, se isto não for possível, copiar essas classes para uma aplicação de testes e executar elas, de forma a retornar as informações da base de dados.
GOSTEI 1
Thiago Porto

Thiago Porto

03/12/2012

Também pensei em trabalhar sem usar essas referências entre as tabelas, mas como não sou experiente no assunto fico preocupado se no futuro pode dar algum problema, e também em relação as consultas que houver relacionamento pode haver algum problema, estou usando LINQ?
GOSTEI 1
Renato Groffe

Renato Groffe

03/12/2012

Thiago,


Normalmente quando desenvolvo Web Services, procuro retornar sempre a menor quantidade de informações possível. A razão disso está em diminuir o tráfego de rede e também devolver os dados em um formato bem simples (sem envolver uma hierarquia classes) de forma a possibilitar que não ocorram problemas quando o serviço for consumido em uma aplicação em outra plataforma (Java, por exemplo).

O mecanismo de acesso a dados que for utilizado não faz tanta diferença. O importante é ter em mente a necessidade de fazer as coisas bem simples e organizadas.

No seu caso, eu criar um método que devolve os estados, além de uma segunda operação que devolve as cidades. Dessa maneira, só realmente quando fosse necessário seriam retornadas informações de cidades ou estados.
GOSTEI 1
Thiago Porto

Thiago Porto

03/12/2012

O link passado não funcionou, mas vou usar essa última dica, acho que é melhor sem usar referências de classes e estive lendo alguns artigos a respeito e usa-se mais é para quando é gerado o banco a partir da aplicação.
Obrigado pela ajuda! Esperando por artigos seus a respeito.
GOSTEI 1
Renato Groffe

Renato Groffe

03/12/2012

Opa Thiago, sem problemas.

Vou tentar montar a partir da próxima semana algo que envolva JQuery + WCF + Fluent NHibernate. Já tinha a intenção de fazer isso antes e vou aproveitar a deixa agora.

Até
GOSTEI 1
Gabriel Simas

Gabriel Simas

03/12/2012

O link passado não funcionou, mas vou usar essa última dica, acho que é melhor sem usar referências de classes e estive lendo alguns artigos a respeito e usa-se mais é para quando é gerado o banco a partir da aplicação.
Obrigado pela ajuda! Esperando por artigos seus a respeito.


E aí Thiago. Conseguiu resolver o seu problema? caso sim nos informe para que possamos fechar este tópico como "[RESOLVIDO]".

Forte Abraço.
GOSTEI 0
POSTAR