Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: «Vicø™» en 4 Diciembre 2013, 15:57 pm



Título: ObjectContext.SaveChanges (Método)
Publicado por: «Vicø™» en 4 Diciembre 2013, 15:57 pm
Hola nuevamente... en esta oportunidad quisiera saber si me pueden ayudar con algun consejo de como optimizar el metodo base.SaveChanges(). Veran tengo un sistema que ya tiene registrados mas de 10.000 ventas y actualmente al realizar una venta tarda 6 segundos al ejecutarse este metodo. Les paso un parte de mi codigo que tal vez pueda servirles de ayuda.

Código
  1. public bool RegistrarNuevaVenta()
  2.        {
  3.            bool noHayExito = true;
  4.            bool puedeContinuar = true;
  5.  
  6.            while (noHayExito && puedeContinuar)
  7.            {
  8.                MODEL.Ventas ventaAux = new MODEL.Ventas();
  9.                GestionEntities cx = new GestionEntities();
  10.                TransactionOptions opts = new TransactionOptions();
  11.                opts.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
  12.                System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opts);
  13.                try
  14.                {
  15.                    MODEL.Ventas venta = new MODEL.Ventas();
  16.                    venta.Activo = true;
  17.  
  18.                    CargarDatoGenerales(cx, venta);
  19.                    CargarInventario(cx, venta, View.FechaVentaView);
  20.                    CargarServicios(cx, venta);
  21.  
  22.                    venta.EstadoInventario = InferirEstadoInventario();
  23.  
  24.                    if (View.TipoVentaView == VentasAgregarPresenter.VENTA_RESERVA)
  25.                    {
  26.                        CargarReserva(cx, venta);
  27.                    }
  28.  
  29.                    if (View.TipoVentaView == VENTA_CONTADO
  30.                    || View.TipoVentaView == VENTA_RESERVA)
  31.                    {
  32.                        CargarPago(cx, venta);
  33.  
  34.                        venta.EstadoPago = (venta.SaldoBs > 0 ? Cttes.Ventas.Estado.Pago.PENDIENTE : Cttes.Ventas.Estado.Pago.CANCELADO);
  35.                    }
  36.  
  37.                    if (View.TipoVentaView == VENTA_CREDITO_NORMAL)
  38.                    {
  39.                        CargarPlanPagos(cx, venta);
  40.                        venta.EstadoPago = Cttes.Ventas.Estado.Pago.PENDIENTE;
  41.                    }
  42.  
  43.                    if (View.TipoVentaView == VENTA_CREDITO_SIMPLE
  44.                    || View.TipoVentaView == VENTA_CREDITO_NORMAL)
  45.                    {
  46.                        //Una venta a crédito no registra ningún pago inicial.
  47.                        venta.SaldoBs = venta.MontoTotalBs;
  48.                        venta.SaldoSus = venta.MontoTotalSus;
  49.                        venta.EstadoPago = Cttes.Ventas.Estado.Pago.PENDIENTE;
  50.                    }
  51.  
  52.                    cx.Ventas.AddObject(venta);
  53.                    [b]cx.SaveChanges(); //Es aqui donde tarda 6 seg[/b]
  54.                    scope.Complete();
  55.                    ventaAux = venta;
  56.                    VentaA = venta;
  57.                    noHayExito = false;
  58.                }
  59.                catch (InsuficienteStockException ex1)
  60.                {
  61.                    Mensaje.Instancia.NotificarMensajeProblema(ex1.Message);
  62.                    puedeContinuar = false;
  63.                }
  64.                catch (InvalidOperationException ex2)
  65.                {
  66.                    Mensaje.Instancia.NotificarMensajeProblema(ex2.Message);
  67.                    puedeContinuar = false;
  68.                }
  69.                catch (AsegurarCuotaFraccionException ex3)
  70.                {
  71.                    Mensaje.Instancia.NotificarMensajeProblema(string.Format("Producto: {0}\tDeposito: {1}\nNo existe suficiente stock", ex3.Producto.Nombre, ex3.Deposito.Nombre));
  72.                    puedeContinuar = false;
  73.                }
  74.                catch (Exception ex)
  75.                {
  76.                    if (Utilidad.EsDeadLock(ex))
  77.                    {
  78.                        puedeContinuar = true;
  79.                    }
  80.                    else
  81.                    {
  82.                        Mensaje.Instancia.NotificarExcepcion(ex);
  83.                        puedeContinuar = false;
  84.                    }
  85.                }
  86.                finally
  87.                {
  88.                    cx.Dispose();
  89.                    scope.Dispose();
  90.                }
  91.            }



[MOD]: Utiliza las etiquetas de inserción de código.