Usuário com melhor resposta
Consulta web api com várias tabelas

Pergunta
-
Tenho uma API onde fiz o mapeamento do banco pelo power tools(partindo de um banco existente) tenho duas tabelas : usuario e departamento onde tenho os sequintes relacionamentos :
Usuario
public virtual DEPARTAMENTO DEPARTAMENTO { get; set; }
Departamento
public virtual ICollection<USUARIO> USUARIO { get; set; }
No mapeamento
this.HasOptional(t => t.DEPARTAMENTO) .WithMany(t => t.USUARIO) .HasForeignKey(d => d.dep_id);
Minha dúvida é como faço a consulta pois fiz assim e dá erro :
public async Task<IHttpActionResult> Get(int id) { try { var response = await _db.USUARIO .Include(x => x.DEPARTAMENTO) .Where(x => x.usu_id== id) .OrderBy(x => x.usu_nome).ToListAsync();
Junior
Respostas
-
Você precisará alterar uma configuração do Json.Net para evitar problemas com loop de referência:
Sugiro criar essa classe que extende ActionResult:
public class JsonNetResult : ActionResult { public Encoding ContentEncoding { get; set; } public string ContentType { get; set; } public object Data { get; set; } public JsonSerializerSettings SerializerSettings { get; set; } public Formatting Formatting { get; set; } public JsonNetResult() { SerializerSettings = new JsonSerializerSettings(); } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); HttpResponseBase response = context.HttpContext.Response; response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; if (Data != null) { JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); serializer.Serialize(writer, Data); writer.Flush(); } } }
Daí em sua action Web API (ou MVC) você utilizá este código para retornar os dados desejados:
return new JsonNetResult() { Formatting = Newtonsoft.Json.Formatting.Indented, Data = result, SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore } };
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".
- Marcado como Resposta Junior_luiz terça-feira, 11 de abril de 2017 17:58
-
Juliano, pesquisando melhor achei uma solução mais prática no webapiconfig da api coloquei isso :
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
Junior
- Marcado como Resposta Junior_luiz terça-feira, 11 de abril de 2017 17:27
Todas as Respostas
-
Qual erro? Dê mais informações.
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".
-
{"Message":"An error has occurred.","ExceptionMessage":"Self referencing loop detected with type 'Projeto.API.Models.Entities.USUARIO'. Path '[0].DEPARTAMENTO.USUARIO'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":" em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
Junior
-
Você precisará alterar uma configuração do Json.Net para evitar problemas com loop de referência:
Sugiro criar essa classe que extende ActionResult:
public class JsonNetResult : ActionResult { public Encoding ContentEncoding { get; set; } public string ContentType { get; set; } public object Data { get; set; } public JsonSerializerSettings SerializerSettings { get; set; } public Formatting Formatting { get; set; } public JsonNetResult() { SerializerSettings = new JsonSerializerSettings(); } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); HttpResponseBase response = context.HttpContext.Response; response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; if (Data != null) { JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); serializer.Serialize(writer, Data); writer.Flush(); } } }
Daí em sua action Web API (ou MVC) você utilizá este código para retornar os dados desejados:
return new JsonNetResult() { Formatting = Newtonsoft.Json.Formatting.Indented, Data = result, SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore } };
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".
- Marcado como Resposta Junior_luiz terça-feira, 11 de abril de 2017 17:58
-
Juliano, pesquisando melhor achei uma solução mais prática no webapiconfig da api coloquei isso :
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
Junior
- Marcado como Resposta Junior_luiz terça-feira, 11 de abril de 2017 17:27
-
Trata-se da mesma configuração, porém aplicado para toda aplicação. Se precisar tratar referência em loop de uma forma diferente, terá que utilizar o código que eu mencionei para tratar a exceção à regra.
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".