none
Modificar con Entity Framework RRS feed

  • Pregunta

  • Hola a todos nuevamente pidiendo ayuda.

    necesito modificar tres campos en una tabla, estoy trabajando con Entity Framework

    En Sql mis campos where serian Caja_Id = 1, Usuario_Id = 1 Fecha _Fecha

    si cumplen estos campos me que modifiquen 

    Campo c

    Campo d

    Campo e

    tengo este código

    public static void CerrarCaja(int Caja_id, int Usuario_Id, DateTime Fecha)
            {
                using (GourmetEntities db = new GourmetEntities())
                {
                    try
                    {
                        var Modificado = db.tblAperturaCajaDiarias.Where(x => x.Caja_Id == Caja_id).SingleOrDefault();
                        Modificado.MontoFinal = MontoFinal;
                        Modificado.EstadoDeCaja = false;
                        Modificado.HoraCierreCaja = tblAperturaCajaDiaria.HoraCierreCaja;
                        db.SaveChanges();
                    }
                    catch (SqlException ex)
                    {
    
                        MessageBox.Show(ex.Message + ex.StackTrace, "MENSAJE DE ERROR");
                    }
                }
            }

    pero no se como mas hacer para que solo cambie esos datos de mi tabla.

    he buscado en internet pero consigo como hacer esto por favor me pueden ayudar.

    gracias

    Ro

    lunes, 11 de mayo de 2020 21:08

Respuestas

  • hola

    >>en el proceso anterior el usuario abrió la caja, con un monto inicial de 600, el "EstadodeCaja" = True abierta

    un usuario puede tener mas de una caja abierta al mismo tiempo ? mas bien es una pregunta funcional, yo creeria que no deberia permitirse


    >>al final del día busco ese usuario, esa caja y esa fecha e ingreso el monto con que se cerro la caja

    si tienes el Id de la caja y el usuario ya no necesitas la fecha porque solo tendra una sola abierta, no puede abrir la misma caja mas de una vez

    public static void CerrarCaja(int Caja_Id, int Usuario_Id) { using (GourmetEntities db = new GourmetEntities()) { var Caja = db.tblAperturaCajaDiarias .FirstOrDefault(x => x.Caja_Id == Caja_Id && x.Usuario_Id == Usuario_Id && x.EstadodeCaja);

    if(Caja != null) { Caja.MontoFinal = tblAperturaCajaDiaria.MontoFinal; Caja.EstadoDeCaja = false; Caja.HoraCierreCaja = tblAperturaCajaDiaria.HoraCierreCaja; db.SaveChanges(); } } }

    Si el usuario solo puede abrir la misma caja solo una vez entonces buscas la unica que tenga el estado en true


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 13 de mayo de 2020 5:00

Todas las respuestas

  • En principio está bien como lo tienes. Con EF lo que se hace es recuperar el objeto existente, cambiar los campos deseados en ese objeto, y volverlo a grabar. Esto solo cambia en la tabla los campos modificados; los otros mantienen su valor porque primero los leíste y después has grabado con el mismo valor que ya tenían.

    Aparentemente esto es justo lo que estás haciendo en tu código, así que en teoría debería funcionar. Si no funciona, necesitamos algún dato más sobre qué es exactamente lo que está fallando, qué síntomas se observan.

    Lo que sí veo es que en el Where únicamente has metido uno de los campos; según tu pregunta, aunque no está muy claro, parece que querías filtrar por tres de ellos. En ese caso, hay que hacer un && de los tres en el Where.

    Y otro potencial problema es que haya más de un registro que cumpla la condición, en cuyo caso el SingleOrDefault daría un error, o que no exista ninguno, en cuyo caso el SingleOrDefault devolverá null y se producirá un NullReferenceException en la siguiente línea.

    martes, 12 de mayo de 2020 5:53
    Moderador
  • Alberto, buen día, un gusto.

    leyendo lo que me suguiere, hice esto la verdad no se, pueda que esa o no buena complementación, funciona por favor me puede comentar que si esta o no bien por favor

    public static void CerrarCaja(tblAperturaCajaDiaria tblAperturaCajaDiaria, int Caja_Id, int Usuario_Id, DateTime Fecha)
            {
                using (GourmetEntities db = new GourmetEntities())
                {
                    try
                    {
                        var Modificado = db.tblAperturaCajaDiarias.Where(x => x.Caja_Id == Caja_Id && x.Usuario_Id == Usuario_Id && x.FechaMovimiento == Fecha).SingleOrDefault();
                        Modificado.MontoFinal = tblAperturaCajaDiaria.MontoFinal;
                        Modificado.EstadoDeCaja = false;
                        Modificado.HoraCierreCaja = tblAperturaCajaDiaria.HoraCierreCaja;
                        db.SaveChanges();
                    }
                    catch (SqlException ex)
                    {
    
                        MessageBox.Show(ex.Message + ex.StackTrace, "MENSAJE DE ERROR");
                    }
                }
            }

    funciona, pero creo que podría ir sin los int Caja_Id y los demas, y Sí. me encargue que un usuario abre una caja por día.

    Gracias

    Roberto

    martes, 12 de mayo de 2020 13:16
  • hola

    >>si cumplen estos campos me que modifiquen

    eso del campo c, d, e que significa no entendi

    >>pero no se como mas hacer para que solo cambie esos datos de mi tabla.

    En el metodo CerrarCaja() pasas 3 parametros, pero de dodne sale MontoFinal o  tblAperturaCajaDiaria.HoraCierreCaja ? como que aparecen magicamente, esa info tambien deberia llegar por parametros

    Entiendo quieres aplicar varios filtros en el Where del linq, pero el resultado es solo una unica entidad o son varias? porque quizas debas iterar en un foreach para actualizar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 12 de mayo de 2020 13:40
  • Leandro buen día, un gusto.

    eso de los campos c, d, e los cambio por Caa_Id, Usuario_Id, Fecha

    lo que pasa que en un proceso anterior, un usuario abre la caja, digamos que para trabajar el dia entero, al final del día

    debe cerrar la caja. haber les muestro la imagen.

    como verán, en el proceso anterior el usuario abrió la caja, con un monto inicial de 600, el "EstadodeCaja" = True abierta, caja abierta, al final del día busco ese usuario, esa caja y esa fecha e ingreso el monto con que se cerro la caja y pongo el "EstadodeCaja" = false y la hora del cierre de la caja.

    como consigo hacer ese cambio, por favor estimado. 

    Gracias

    Ro

    martes, 12 de mayo de 2020 13:58
  • creo que podría ir sin los int Caja_Id y los demas

    Bueno, ALGO hay que poner en el Where para indicar cuál es el registro que vas a modificar. Tal vez no sea el Caja_Id y los otros campos, sino otra cosa. Tú sabrás cómo está organizada tu base de datos y cuál es el campo o campos que utilizas para identificar registros de manera unívoca. Lo más normal sería usar ahí el campo o campos que constituyan la clave primaria de la tabla. Como es lógico, nosotros no tenemos forma de saber cuáles son; es necesario conocer el diseño de la tabla.
    martes, 12 de mayo de 2020 17:17
    Moderador
  • hola

    >>en el proceso anterior el usuario abrió la caja, con un monto inicial de 600, el "EstadodeCaja" = True abierta

    un usuario puede tener mas de una caja abierta al mismo tiempo ? mas bien es una pregunta funcional, yo creeria que no deberia permitirse


    >>al final del día busco ese usuario, esa caja y esa fecha e ingreso el monto con que se cerro la caja

    si tienes el Id de la caja y el usuario ya no necesitas la fecha porque solo tendra una sola abierta, no puede abrir la misma caja mas de una vez

    public static void CerrarCaja(int Caja_Id, int Usuario_Id) { using (GourmetEntities db = new GourmetEntities()) { var Caja = db.tblAperturaCajaDiarias .FirstOrDefault(x => x.Caja_Id == Caja_Id && x.Usuario_Id == Usuario_Id && x.EstadodeCaja);

    if(Caja != null) { Caja.MontoFinal = tblAperturaCajaDiaria.MontoFinal; Caja.EstadoDeCaja = false; Caja.HoraCierreCaja = tblAperturaCajaDiaria.HoraCierreCaja; db.SaveChanges(); } } }

    Si el usuario solo puede abrir la misma caja solo una vez entonces buscas la unica que tenga el estado en true


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 13 de mayo de 2020 5:00
  • Sí, efectivamente el usuario puede abrir una única caja por día y debe cerrarla en el mismo día, pero. en esa tabla debe ingresarse como un histórico y por eso es que debe estar la fecha, y claro quedo muy bien. 

    Gracias Leandro, 

    Gracias Alberto.

    miércoles, 13 de mayo de 2020 14:10