public static bool Modificar(Facturacion facturacion) { bool paso = false; Contexto contexto = new Contexto(); try { //todo: buscar las entidades que no estan para removerlas var visitaant = FacturacionBLL.Buscar(facturacion.FacturaID); foreach (var item in visitaant.Detalle)//recorrer el detalle aterior { //restar todas las visitas contexto.Articulos.Find(item.ArticuloID).Vigencia += item.Cantidad; //determinar si el item no esta en el detalle actual if (!facturacion.Detalle.ToList().Exists(v => v.ID == item.ID)) { // contexto.Articulos.Find(item.ArticulosID).Inventario -= item.Cantidad; item.Articulos = null; //quitar la ciudad para que EF no intente hacerle nada contexto.Entry(item).State = EntityState.Deleted; } } var inversion = contexto.inversion.Find(facturacion.InversionID); if (facturacion.Total == facturacion.Abono) { inversion.Monto += facturacion.Total; contexto.Entry(inversion).State = EntityState.Modified; } else { contexto.Cliente.Find(facturacion.ClienteID).Total += facturacion.Total; inversion.Monto -= facturacion.Total; Cliente EntradaAnterior = BLL.ClienteBLL.Buscar(facturacion.ClienteID); //identificar la diferencia ya sea restada o sumada decimal diferencia; diferencia = facturacion.Total - EntradaAnterior.Total; //aplicar diferencia al inventario Cliente cliente = BLL.ClienteBLL.Buscar(facturacion.ClienteID); cliente.Total += diferencia; ClienteBLL.Modificar(cliente); Facturacion EntradaAnteri = BLL.FacturacionBLL.Buscar(facturacion.FacturaID); //identificar la diferencia ya sea restada o sumada decimal diferenc; diferenc = facturacion.Total - EntradaAnteri.Total; //aplicar diferencia al inventario Inversion fact = BLL.InversionBLL.Buscar(facturacion.InversionID); fact.Monto += diferenc; InversionBLL.Modificar(fact); } //recorrer el detalle foreach (var item in facturacion.Detalle) { //Sumar todas las visitas contexto.Articulos.Find(item.ArticuloID).Vigencia -= item.Cantidad; //Muy importante indicar que pasara con la entidad del detalle var estado = item.ID > 0 ? EntityState.Modified : EntityState.Added; contexto.Entry(item).State = estado; } Facturacion EntradaAnterio = BLL.FacturacionBLL.Buscar(facturacion.FacturaID); //identificar la diferencia ya sea restada o sumada decimal diferenci; diferenci = facturacion.Total - EntradaAnterio.Total; //aplicar diferencia al inventario Inversion factu = BLL.InversionBLL.Buscar(facturacion.InversionID); factu.Monto += diferenci; InversionBLL.Modificar(factu); //Idicar que se esta modificando el encabezado contexto.Entry(facturacion).State = EntityState.Modified; if (contexto.SaveChanges() > 0) { paso = true; } contexto.Dispose(); } catch (Exception) { throw; } return(paso); }