none
Consulta com entity framework e WCF RRS feed

  • Pergunta

  • Não estou conseguindo fazer uma consulta com entidades relacionadas em um serviço wcf com linq to entities.

    Quando faço uma consulta com apenas uma entidade, ele me retorna o resultado que preciso, mas quando faço uma consulta relacionada, da o seguinte erro:

    Visual Studio: The remote server returned an error: NotFound.

    Fiddler:

     ReadResponse() failed: The server did not return a response for this request.

    [OperationContract]
        public List<Grupo> GetGrupo()
        {
          using (var contexto = new Contexto())
          {
            try
            {
              contexto.Configuration.LazyLoadingEnabled = false;
              var Query = (from g in contexto.Grupo.Include("Empresa")
                         select g).ToList();
              return Query;
            }
            catch (Exception ex)
            {
              throw new Exception(ex.Message);
            }
          }
        }

    O codigo acima é o codigo que uso para trazer o resultado.

    Já tentei tudo o que sabia.

    Por favor, me ajudem. Obrigado...

    segunda-feira, 4 de julho de 2011 01:40

Respostas

  • Boas v-lob,

    Se estiver utilizando a template POCO, isso talvez possa te ajudar em algo: http://www.israelaece.com/post/Expondo-Tipos-POCO-atraves-do-WCF.aspx
    http://www.israelaece.com
    quarta-feira, 13 de julho de 2011 11:14
    Moderador
  • Muito obrigado a todos que ajudaram.

    Como disse antes, tentei de varias formas corrigir esse problema. Enfim, hoje, consegui resolver.

    - Tive que desativar a criação de proxy na classe de contexto:

    public class Contexto : DbContext
      {
        public Contexto() : base("outro") 
        { 
          Configuration.ProxyCreationEnabled = false;
        }
        public DbSet<Grupo> Grupo { get; set; }
        public DbSet<Empresa> Empresa { get; set; }
    
        static Contexto()
        {
          Database.SetInitializer<Contexto>(new Inicializador());
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
          modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
          modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
      }
    

    - Coloquei o "isreference = true" sobre a classe Pai:

    [DataContract(IsReference = true)]
      public class Grupo
      {
        [DataMember]
        public int id { get; set; }
        [DataMember]
        public string nome { get; set; }
        [DataMember]
        public virtual ICollection<Empresa> Empresa { get; set; }
      }
    


    - E como podem ver acima, mesmo sendo "Silverlight-Enabled Wcf service", tive que colocar o atributo "[DataMember]", em cada uma das propriedades...

    Agradeço novamente a todos, e espero que essa solução possa ajudar outras pessoas...

    Muito obrigado

    domingo, 24 de julho de 2011 20:59

Todas as Respostas

  • Como vc está publicando seu service?ele está no seu iis
    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC
    terça-feira, 5 de julho de 2011 11:59
  • Olá Seilor.

    Desculpe a demora, mas não tenho como me logar no trabalho.

    Esta publicado no localhost do proprio projeto.

    Estou hospedando em asp.net, e também estou usando silverlight-enabled-wcf, se for ajudar.

    Para melhor entendimento, abaixo esta as entidades e o webConfig.

     

    public class Grupo
      {
        public int Id { get; set; }
        public string Descricao { get; set; }
    
        public virtual ICollection<Empresa> Empresa { get; set; }
      }

    public class Empresa
      {
        public int Id { get; set; }
        public string Razao { get; set; }
    
        public virtual Grupo Grupo { get; set; }
      }

    <?xml version="1.0"?>
    
    <!--
     For more information on how to configure your ASP.NET application, please visit
     http://go.microsoft.com/fwlink/?LinkId=169433
     -->
    
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
     <connectionStrings>
      <add name="NovoTeste" connectionString="data source=fabio-pc\fabio_server;
         initial catalog=NovoTeste; Integrated Security=SSPI"
         providerName="System.Data.SqlClient" />
     </connectionStrings>
     <system.serviceModel>
      <behaviors>
       <serviceBehaviors>
        <behavior name="">
         <dataContractSerializer maxItemsInObjectGraph ="2147483647"/>
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name ="ServiceBehavior">
         <dataContractSerializer maxItemsInObjectGraph ="655360"/>
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
      <bindings>
       <customBinding>
        <binding name="novoTeste.Web.Service1.customBinding0">
         <binaryMessageEncoding />
         <httpTransport />
        </binding>
       </customBinding>
      </bindings>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
       multipleSiteBindingsEnabled="true" />
      <services>
       <service name="novoTeste.Web.Service1">
        <endpoint address="" binding="customBinding" bindingConfiguration="novoTeste.Web.Service1.customBinding0"
         contract="novoTeste.Web.Service1" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       </service>
      </services>
     </system.serviceModel>
    </configuration>
    

    Muito obrigado...

    terça-feira, 5 de julho de 2011 23:10
  • Boa tarde!

    Estive olhando um post do Israel Aece "Usando Linq to Sql com WCF", (http://www.israelaece.com/?tag=/serializacao&page=2), e acho que pode ser Serialização circular. Mas fiz do modo com indicava no post e não consegui sucesso.

    Se for serialização circular mesmo, como fazer isso usando silverlight-enabled wcf service?

    Obrigado.


    sábado, 9 de julho de 2011 18:12
  • Boas v-lob,

    Se estiver utilizando a template POCO, isso talvez possa te ajudar em algo: http://www.israelaece.com/post/Expondo-Tipos-POCO-atraves-do-WCF.aspx
    http://www.israelaece.com
    quarta-feira, 13 de julho de 2011 11:14
    Moderador
  • Boa tarde Israel!

    Não sei se isso pode ser o problema, mas estou usando code-first do entity framework 4.1. Nele eu uso DbContext para criar a classe de contexto. Assim, acredito eu, não tem a opção (ctx.ContextOptions.ProxyCreationEnabled = false;("pelo menos não achei"). O que eu achei foi (ctx.Configuration.ProxyCreationEnabled = false;).

    Não sei se é a mesma coisa, mas, tentei com esse método e também não funcionou. Ainda não tentei a segunda maneira indicada no artigo, mas vou testar assim que puder.

    Por enquanto, Muito obrigado...

    quinta-feira, 14 de julho de 2011 15:52
  • Boas v-lob,

    Tente ligar o tracing e capturar o problema que está ocorrendo: http://www.israelaece.com/post/WCF-Tracing.aspx
    http://www.israelaece.com
    segunda-feira, 18 de julho de 2011 11:10
    Moderador
  • Ligando o trace deu as seguintes mensagens:
    Process action 'urn:Service1/GetGrupo'. 23 1s 22:38:10 22:38:12
    <Message>There was an error while trying to serialize parameter :GetGrupoResult. The InnerException message was 'Type 'System.Data.Entity.DynamicProxies.svc_Grupo_050D9DA615CF991CD458906D2A9B95273157A6CC7B64DB2FA8176B62BAEBE2C2' with data contract name 'svc_Grupo_050D9DA615CF991CD458906D2A9B95273157A6CC7B64DB2FA8176B62BAEBE2C2:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'. Please see InnerException for more details.</Message>
    
    

    Processing message 2. 5 30s 22:38:12 22:38:42
    <Message>The number of bytes available is inconsistent with the HTTP Content-Length header. There may have been a network error or the client may be sending invalid requests.</Message>
    
    

    Não sei mexer no trace viewer, mas foi isso o que pude identificar como mais familiar...
    Agradeço desde já...., Muito obrigado...
     

    quarta-feira, 20 de julho de 2011 01:53
  • Muito obrigado a todos que ajudaram.

    Como disse antes, tentei de varias formas corrigir esse problema. Enfim, hoje, consegui resolver.

    - Tive que desativar a criação de proxy na classe de contexto:

    public class Contexto : DbContext
      {
        public Contexto() : base("outro") 
        { 
          Configuration.ProxyCreationEnabled = false;
        }
        public DbSet<Grupo> Grupo { get; set; }
        public DbSet<Empresa> Empresa { get; set; }
    
        static Contexto()
        {
          Database.SetInitializer<Contexto>(new Inicializador());
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
          modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
          modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
      }
    

    - Coloquei o "isreference = true" sobre a classe Pai:

    [DataContract(IsReference = true)]
      public class Grupo
      {
        [DataMember]
        public int id { get; set; }
        [DataMember]
        public string nome { get; set; }
        [DataMember]
        public virtual ICollection<Empresa> Empresa { get; set; }
      }
    


    - E como podem ver acima, mesmo sendo "Silverlight-Enabled Wcf service", tive que colocar o atributo "[DataMember]", em cada uma das propriedades...

    Agradeço novamente a todos, e espero que essa solução possa ajudar outras pessoas...

    Muito obrigado

    domingo, 24 de julho de 2011 20:59