none
EF con WebApi RRS feed

  • Pregunta

  • Hola

    tengo un problema aleatorio q no logro identificar y pienso que puede ser por la forma en la que está siendo utilizado el EF. Tengo una app con wpf /webapi/ef6 aparentemente algunas ocaciones se bloquea el serviio y la aplicacion comienza a recibir errores de outof memory, lo que quisiera es q me digan su opinion acerca de la forma en la que esta estructurada la app en el uso del EF

    en la webapi tengo controllers q solamente instancian una clase de negocio y llamn un metodo para luego devolver los dato, asi:

            [HttpGet]
    public HttpResponseMessage GetDatos(short CodS, short CodO, string Desde, string Hasta)
    {
        HttpResponseMessage response;
        try
        {
            DateTime fechaDesde = DateTime.ParseExact(Desde, "d/M/yyyy"CultureInfo.InvariantCulture).Date;
            DateTime fechaHasta = DateTime.ParseExact(Hasta, "d/M/yyyy"CultureInfo.InvariantCulture).Date;
     
            clsVenta vtas= new clsVenta();
            IEnumerable<CVentaResumen> ventas = vtas.GetVentasResumen(CodS, CodO, fechaDesde, fechaHasta);
            response = Request.CreateResponse<IEnumerable<CVentaResumen>>(HttpStatusCode.OK,  ventas);
        }
        catch (Exception e)
        {
            response = Request.CreateResponse(HttpStatusCode.InternalServerError, CapturaError(e));
        }
        return response;
    }

    La Clase  clsVenta  deriva de una clase base que crea la instancia del dbmodel y la expone como una propiedad de la siguiente forma

    public class clsBase  {      private static miMModel db;      static public miMModel dbModel      {          get          {              if (db == null)                  db = new miMModel();              return db;          }      }
    ........
    ........
    }

    el método que ejecuta la consulta es el siguiente:
    public IEnumerable<VRep.CVentaResumen> GetVentasResumen(short CodSucursal, short CodOficina, DateTime Desde, DateTime Hasta)
    {
        IEnumerable<VRep.CVentaResumen> colventas;
        
        
            colventas = (from venta in dbModel.tVentas
                         join cli in dbModel.tPersonas on venta.CodCli equals cli.CodPer
                         join usu in dbModel.tPersonas on venta.Usuario equals usu.CodPer
                         join ofi in dbModel.tOficinas on venta.CodOfic equals ofi.CodOfi
                         where venta.CodSuc == CodSucursal && venta.CodOfic == CodOficina
                                && Desde <= venta.Fec && venta.Fec <= Hasta 
                         select new VRep.CVentaResumen()
                         {
                             IdPedido = venta.IdPedido,
                             Ges = venta.Ges.Value,
                             CodCli = venta.CodCli.Value,
                             CodCliUser = cli.CodPerUsr,
                             NomCli = cli.NombreCompleto,
                             NomFac=venta.NomFac,
                             CodOfi = venta.CodOfic,
                             CodUser = venta.Usuario,
                             Fecha = venta.Fec,
                             Glosa = venta.Glosa,
                             AtendidoPor = venta.AtendidoPor,
                             NomOfic = ofi.NomOficina,
                             NomUser = usu.NombreCompleto,
                             NroPedido = venta.NroPedido
                         }).ToList();
        
        return colventas;
    }
    
    

    Los Viewmodel obtienen los datos del servicio por medio de metodos q etan en una clase de puro metodos static como el siguiente

    static public async Task<IEnumerable<CVentaResumen>> GetVentas(short CodSurcursal, short CodOficina, DateTime Desde, DateTime Hasta, int NroPedido)
    {
        IEnumerable<CVentaResumen> Ventas = null;
        try
        {
            using (HttpClient client = new HttpClient())
            {
                IniciaHttpClient_Headers(client);
     
                Error = "";
                string sUrl = GetURL() + string.Format("Venta/GetVentasXFecs/?CodSucursal={0}&CodOficina={1}&Desde={2}&Hasta={3}",
                                            CodSurcursal.ToString(), CodOficina.ToString(), Desde.ToShortDateString(), Hasta.ToShortDateString());
                var Response = await client.GetAsync(new Uri(sUrl));
                if (Response.IsSuccessStatusCode)
                    Ventas = Response.Content.ReadAsAsync<ObservableCollection<CVentaResumen>>().Result;
                else
                    await CapturaError(Response);
            }
        }
        catch (Exception e)
        {
            Error = e.Message;
        }
        return Ventas;
    }

    una de mis principales dudas es cuando usar metodos static y cuando no, tengo la sensacion que hay un problema en el manejo de ese concepto

    Les agradeceré las opiniones

    Gracias!!!


    Salu2 Sergio T

    martes, 12 de enero de 2016 13:07

Todas las respuestas

  • hola

    >>una de mis principales dudas es cuando usar metodos static y cuando no, tengo la sensacion que hay un problema en el manejo de ese concepto

    Si usas IoC con inyeccion de dependencias podrias usas instancias de la clase que implementa GetVentas(), pero seria un IoC librery como Unity, autofac, Ninject, etc quien deternine la instancia de la clase que se inyecta en el viewmodel

    de esta forma no necesitas usar static

    >>tengo un problema aleatorio q no logro identificar y pienso que puede ser por la forma en la que está siendo utilizado el EF.

    el problema genera algun mensaje de error ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 12 de enero de 2016 14:18
  • Hola Leandro

    No he trabajado con IoC, la verdad q no conozco de ese tema, 

    El tema es que de repente el sistema arroja un error de OutOfMemory,... aun no tengo la certeza del lugar en el cual se dá , pero aparentemente es en el servidor web ya que cuando se da eso, reinicio el sitio web y too vuelve a funcionar nuevamente

    gracias por tu tiempo



    Salu2 Sergio T

    martes, 12 de enero de 2016 14:56
  • >>El tema es que de repente el sistema arroja un error de OutOfMemory

    podrias definir un control global de errores

    Global Exception Handling in WPF

    en este podrias logurar a un archivo no solo el message del error, sino lo importante es el StackTrace para poder analizar por donde paso la ejecucion cuando fallo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 12 de enero de 2016 15:56