Usuario
Consulta Get con $http Angular y Web Api

Pregunta
-
Buenas a todos,
Estoy haciendo un servicio en angular que me realiza una paticion web, tal como muestra el codigo:
app.service("OficinasService", function ($http) {
//Obtener Listado de todas las oficinas
this.getOficinas = function () {
return $http.get("/api/Oficina");
}
});y luego desde un controlador angular
app.controller("OficinasController", function ($scope, $log, OficinasService, $http) {
$scope.enEdiccion = false;
$scope.Oficinas = [];
$scope.mensaje = "Mostrando Listado de Oficinas";
mostrarRegistro();
//Function mostrarRegistro de todas las Oficinas
function mostrarRegistro() {
var promiseGet = OficinasService.getOficinas(); //The MEthod Call from service
promiseGet.then(function (pl) { $scope.Oficinas = pl.data; console.log($scope.Oficinas) },
function (errorPl) {
$scope.mensaje = 'Error al Cargar Oficina: ' + errorPl;
$log.error('Error al Cargar Oficina: ', errorPl);
});
}
});El problema es que deberia mostrarme varios registros, dos para ser exacto, pero solo me muestra uno. Imprime por consola el objeto Oficinas y esto es lo que me muestra:
Array[2]0: Object$$hashKey: "object:5"$id: "1"Activo: trueAutor: nullAutorAccion: nullAutorFecha: nullDescripcion: "NDPSA PRINCIPAL"Direccion: nullEmpresa_Id: 1EntityKey: ObjectEs_Principal: trueFecha_Trabajo: "2015-02-21T00:00:00"Oficina_Id: 200Parent_Id: 200Telefono1: nullTelefono2: nullUnico: 6tEmpresas: ObjecttOficinas1: Array[2]tOficinas2: Object__proto__: Object1: Object$$hashKey: "object:6"$ref: "3"__proto__: Objectlength: 2__proto__: Array[0]
si se dan cuenta el primer object, se corresponde con el primer registro y me esta trayendo valores, pero el object1 que representa el segundo registro esta llegando en blanco sin propiedades.
No se a que se debera esta situacion.
Todas las respuestas
-
hola
como serializas la entidad Oficina en el webapi ?
de casualidad esta entidad tiene una propiedad del tipo byte[] o sea alguna imagen?
que pasa si crear tu la informacion de una instancia en el webapi y la envias como respuesta ? porque pareciera que hay un problema en la serializacion desde el webapi
que tipo de lista serializas a json?, porque pareciera que no es un List<>
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Este es el codigo que me genera al crear el controlador WebApi. ¿Hay que configurar algo para procesar formato JSon?
public class OficinaController : ApiController
{
private DBEntities db = new DBEntities();
// GET api/Oficina
public IEnumerable<tOficinas> GettOficinas()
{
var toficinas = db.tOficinas.Include("tEmpresas").Include("tOficinas2");
return toficinas.AsEnumerable();
}
// GET api/Oficina/5
public tOficinas GettOficinas(int id)
{
tOficinas toficinas = db.tOficinas.Single(t => t.Oficina_Id == id);
if (toficinas == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return toficinas;
}
// PUT api/Oficina/5
public HttpResponseMessage PuttOficinas(int id, tOficinas toficinas)
{
if (ModelState.IsValid && id == toficinas.Oficina_Id)
{
db.tOficinas.Attach(toficinas);
db.ObjectStateManager.ChangeObjectState(toficinas, EntityState.Modified);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
// POST api/Oficina
public HttpResponseMessage PosttOficinas(tOficinas toficinas)
{
if (ModelState.IsValid)
{
db.tOficinas.AddObject(toficinas);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, toficinas);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = toficinas.Oficina_Id }));
return response;
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
// DELETE api/Oficina/5
public HttpResponseMessage DeletetOficinas(int id)
{
tOficinas toficinas = db.tOficinas.Single(t => t.Oficina_Id == id);
if (toficinas == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
db.tOficinas.DeleteObject(toficinas);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
return Request.CreateResponse(HttpStatusCode.OK, toficinas);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
} -
Ejecute el api directamente en el navegado y esto es lo que me devuelve:
[{"$id":"1","unico":6,"oficina_Id":200,"empresa_Id":1,"descripcion":"OFICINA PRINCIPAL","direccion":null,"telefono1":null,"telefono2":null,"fecha_Trabajo":"2015-02-21T00:00:00","es_Principal":true,"parent_Id":200,"activo":true,"autor":null,"autorAccion":null,"autorFecha":null,"tEmpresas":{"$id":"2","unico":1,"empresa_Id":1,"rnc":"054-0132296-0","nombre":"EMPRESA XXX","eMail":null,"slogan":null,"autor":"ELVIN.LANDETA","autorAccion":"I","autorFecha":"2015-02-21T00:00:00","tOficinas":[{"$ref":"1"},{"$id":"3","unico":50,"oficina_Id":201,"empresa_Id":1,"descripcion":"SUCURSAL 1","direccion":null,"telefono1":null,"telefono2":null,"fecha_Trabajo":"2015-02-21T00:00:00","es_Principal":true,"parent_Id":200,"activo":true,"autor":null,"autorAccion":null,"autorFecha":null,"tEmpresas":{"$ref":"2"},"tOficinas1":[],"tOficinas2":{"$ref":"1"},"entityKey":{"$id":"4","entitySetName":"tOficinas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Oficina_Id","type":"System.Int32","value":"201"}]}},{"$id":"5","unico":51,"oficina_Id":202,"empresa_Id":1,"descripcion":"SUCURSAL 2","direccion":null,"telefono1":null,"telefono2":null,"fecha_Trabajo":"2015-02-21T00:00:00","es_Principal":true,"parent_Id":200,"activo":true,"autor":null,"autorAccion":null,"autorFecha":null,"tEmpresas":{"$ref":"2"},"tOficinas1":[],"tOficinas2":{"$ref":"1"},"entityKey":{"$id":"6","entitySetName":"tOficinas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Oficina_Id","type":"System.Int32","value":"202"}]}},{"$id":"7","unico":52,"oficina_Id":203,"empresa_Id":1,"descripcion":"SUCURSAL 3","direccion":null,"telefono1":null,"telefono2":null,"fecha_Trabajo":"2015-02-21T00:00:00","es_Principal":true,"parent_Id":200,"activo":true,"autor":null,"autorAccion":null,"autorFecha":null,"tEmpresas":{"$ref":"2"},"tOficinas1":[],"tOficinas2":{"$ref":"1"},"entityKey":{"$id":"8","entitySetName":"tOficinas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Oficina_Id","type":"System.Int32","value":"203"}]}}],"entityKey":{"$id":"9","entitySetName":"tEmpresas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Empresa_Id","type":"System.Int32","value":"1"}]}},"tOficinas1":[{"$ref":"1"},{"$ref":"3"},{"$ref":"5"},{"$ref":"7"}],"tOficinas2":{"$ref":"1"},"entityKey":{"$id":"10","entitySetName":"tOficinas","entityContainerName":"CFNContaWebEntities","entityKeyValues":[{"key":"Oficina_Id","type":"System.Int32","value":"200"}]}},{"$ref":"3"},{"$ref":"5"},{"$ref":"7"}]
-
que pasa si haces
public IEnumerable<tOficinas> GettOficinas() { var toficinas = db.tOficinas.Include("tEmpresas").ToList(); return toficinas; }
para simplificar que solo devuelva las empresas y que se auna lista deconectada de EF
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Editado Leandro TuttiniMVP martes, 24 de febrero de 2015 20:45
-
-
la version de mvc no deberia influir, si quizas la version de EF que uses
la entidad que serializas a json imagino propiedades como ser $id o $ref no tiene definida, o si ?
que sucede si la clase que devuelves la desconectas de EF? o sea haces
public object GettOficinas() { return from item in db.tOficinas
select new {
prop1 = item.prop1,
//resto propiedades
}; }
la idea es ver si es culpa de EF que serializa de form incorrecta a json
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Si, Gracias ahi con eso me funciona, pero entonces, estoy perdiendo la esencia de lo que es el EF, que con solo yo ejecutar por ejemplo TOficinas.Include(TEmpresa) ta tendria en mi clase oficina la asociacion con la clase empresa..
Ya con esto, puedo empezar a desarrolar un proyecto en mi trabajo que debio haber empezado a desarrolarse hace unos dias atras.
Gracias!!!!
-
Buenas,
Tal parece ser que el problema es la asociacion que genera el modelo entre la Tabla Oficina y Empresa, Quite esta asociacion(Clave Foranea) y el metodo funciono muy bien, pero por ejemplo al ejecutar:
// GET api/Oficina
public IEnumerable<tOficinas> GettOficinas()
{
var toficinas = db.tOficinas.Include("tEmpresas").Include("tOficinas2");
return toficinas.AsEnumerable();
}Seria por ejemplo
[
oficina_Id: 1,
nombre: Principal,
Empresa:{
Empresa_Id: 1
nombre: mi empresa }
]
un resultado asi es el que espero obtener, pero al parecer algo anda mal con la asociacion al momento de generar el resultado en formato JSON.
Agradeceria mucho cualquier ayuda que puedan aportarme, ya que si elimino esta asociacion estaria perdiendo muchas pero muchas de las ventajas que ofrece en Entity FrameWork.
-
hola
no probaste quitar la creacion de proxy y lazyload
Turn off lazy loading for all entities
alli mismo define la
propiedad
ProxyCreationEnabled
tambien en falsesaludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Ya casi resuelvo, solo me queda un inconveniente mas, por ejemplo tengo esto
0: Object
$id: 1
descripcion: Oficina X
Empresa_Id: 1
tEmpresas: Object
$Id: 1
Nombre: Mi Empresa
1: Object
$Id: 2
descripcion: Oficina Z
Empresa_Id: 2
tEmpresas: Object
$Id: 2
nombre: Mi Empresa 2
2: Object
$Id: 3
descripcion: Oficina Y
Empresa_Id: 1
tEmpresas: Object
$ref: 2
Si te fija como al una empresa que se repite dentro de un enlace ya en el siguiente registro lo que guarda es una referencia al objeto; ¿Esto es algo propio del Formato JSON o es una Configuracion del MVC? si es asi como se podria solventar este caso. ya que deseo mostrar al lado el nombre de la empresa pero cuando llega a este punto donde lo que encuentra es una referencia, no se como tratarlo....