ObjectContext.SaveChanges (Método)

Iniciado por «Vicø™», 4 Diciembre 2013, 15:57 PM

0 Miembros y 1 Visitante están viendo este tema.

«Vicø™»

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 (csharp) [Seleccionar]
public bool RegistrarNuevaVenta()
       {
           bool noHayExito = true;
           bool puedeContinuar = true;

           while (noHayExito && puedeContinuar)
           {
               MODEL.Ventas ventaAux = new MODEL.Ventas();
               GestionEntities cx = new GestionEntities();
               TransactionOptions opts = new TransactionOptions();
               opts.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
               System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opts);
               try
               {
                   MODEL.Ventas venta = new MODEL.Ventas();
                   venta.Activo = true;

                   CargarDatoGenerales(cx, venta);
                   CargarInventario(cx, venta, View.FechaVentaView);
                   CargarServicios(cx, venta);

                   venta.EstadoInventario = InferirEstadoInventario();

                   if (View.TipoVentaView == VentasAgregarPresenter.VENTA_RESERVA)
                   {
                       CargarReserva(cx, venta);
                   }

                   if (View.TipoVentaView == VENTA_CONTADO
                   || View.TipoVentaView == VENTA_RESERVA)
                   {
                       CargarPago(cx, venta);

                       venta.EstadoPago = (venta.SaldoBs > 0 ? Cttes.Ventas.Estado.Pago.PENDIENTE : Cttes.Ventas.Estado.Pago.CANCELADO);
                   }

                   if (View.TipoVentaView == VENTA_CREDITO_NORMAL)
                   {
                       CargarPlanPagos(cx, venta);
                       venta.EstadoPago = Cttes.Ventas.Estado.Pago.PENDIENTE;
                   }

                   if (View.TipoVentaView == VENTA_CREDITO_SIMPLE
                   || View.TipoVentaView == VENTA_CREDITO_NORMAL)
                   {
                       //Una venta a crédito no registra ningún pago inicial.
                       venta.SaldoBs = venta.MontoTotalBs;
                       venta.SaldoSus = venta.MontoTotalSus;
                       venta.EstadoPago = Cttes.Ventas.Estado.Pago.PENDIENTE;
                   }

                   cx.Ventas.AddObject(venta);
                   [b]cx.SaveChanges(); //Es aqui donde tarda 6 seg[/b]
                   scope.Complete();
                   ventaAux = venta;
                   VentaA = venta;
                   noHayExito = false;
               }
               catch (InsuficienteStockException ex1)
               {
                   Mensaje.Instancia.NotificarMensajeProblema(ex1.Message);
                   puedeContinuar = false;
               }
               catch (InvalidOperationException ex2)
               {
                   Mensaje.Instancia.NotificarMensajeProblema(ex2.Message);
                   puedeContinuar = false;
               }
               catch (AsegurarCuotaFraccionException ex3)
               {
                   Mensaje.Instancia.NotificarMensajeProblema(string.Format("Producto: {0}\tDeposito: {1}\nNo existe suficiente stock", ex3.Producto.Nombre, ex3.Deposito.Nombre));
                   puedeContinuar = false;
               }
               catch (Exception ex)
               {
                   if (Utilidad.EsDeadLock(ex))
                   {
                       puedeContinuar = true;
                   }
                   else
                   {
                       Mensaje.Instancia.NotificarExcepcion(ex);
                       puedeContinuar = false;
                   }
               }
               finally
               {
                   cx.Dispose();
                   scope.Dispose();
               }
           }





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