Usuário com melhor resposta
Consulta com entity framework e WCF

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...
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- Sugerido como Resposta AndreAlvesLimaModerator quarta-feira, 13 de julho de 2011 16:02
- Marcado como Resposta Israel AeceModerator segunda-feira, 25 de julho de 2011 10: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
- Marcado como Resposta Fábio ---- v-lob domingo, 24 de julho de 2011 21:00
Todas as Respostas
-
-
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... -
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.
-
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- Sugerido como Resposta AndreAlvesLimaModerator quarta-feira, 13 de julho de 2011 16:02
- Marcado como Resposta Israel AeceModerator segunda-feira, 25 de julho de 2011 10:53
-
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...
-
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 -
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... -
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
- Marcado como Resposta Fábio ---- v-lob domingo, 24 de julho de 2011 21:00