none
transacción y concurrencia RRS feed

  • Pregunta

  • Hola

    Tengo una función que me devuelve el numero que le corresponde a una factura.

    private string GetNumeroDocumento(string tipoDocumento )

    {

    //tipoDocumento : "FCA", "FCB", "REM"

    var numero = from p in db.NumeracionDocumentos where p.TipoDoc ==tipoDocumento selec p;

    numero.UltimoIngresado = numero.UltimoIngresado + 1

    db.Entry(NumeracionDocumento).State = EntitySatate.Modified;

    db.SaveChanges()

    //TODO: agrego ceros antes del número para que quede formateado como tiene que salir en la factura.

    Num = numero.UltimoIngresado.toString();

    return num

    }

    public actionResult GenerarFactura()

    {

    Factura fc = new Factura();

    fc.numero = GetNumeroDocumento("FCA");

    }

    Tengo que contemplar el tema de la concurrencia, no debería asignarse un nuevo numero de factura, hasta tanto la transacción anterior se haya confirmado.

    Si hay un arror en la factura, debería hacerse el rollback de la suma de un numero mas que se hizo al asignar el numero de factura.

    cómo manejo esto en mvc con EF?

    Muchas gracias desde ya.

    domingo, 26 de febrero de 2012 19:15

Respuestas

  • Si usas EF-Code-First siempre puedes añadir esta propiedad (con el atributo) a tu entidad "NumeracionDocumento":

    [Timestamp]
    public Byte[] Timestamp { get; set; }

    Y luego puedes ejecutar tu operación de esta forma:

    try
    {
    	var numero = from p in db.NumeracionDocumentos where p.TipoDoc ==tipoDocumento selec p;
    	numero.UltimoIngresado = numero.UltimoIngresado + 1
    	db.Entry(NumeracionDocumento).State = EntitySatate.Modified;
    	db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
    	// recoge la excepcion de concurrencia
    }

    Así podrás encontrar problemas de concurrencia en el registro de la base de datos...

    Un saludo,


    Fernanando Escolar - http://www.programandonet.com/ - @fernandoescolar

    • Propuesto como respuesta Nicoloco martes, 28 de febrero de 2012 2:05
    • Marcado como respuesta sepilrat miércoles, 29 de febrero de 2012 0:46
    lunes, 27 de febrero de 2012 16:55

Todas las respuestas

  • Hola,

    Dentro de Entity Framework tienes un sistema para poder gestionar la concurrencia. Existen 3 tipos: uno optimista, otro pesimista (con bloqueos) y uno Mixto.

    Son muy simples de gestionar, ya que todo consiste en cambiar una propiedad en el .edmx y gestionar las excepciones que lanza.

    Aquí tienes un ejemplo de un modo mixto para MVC:

    http://www.sellsbrothers.com/posts/Details/12699

    Un saludo,


    Fernanando Escolar - http://www.programandonet.com/ - @fernandoescolar

    lunes, 27 de febrero de 2012 8:14
  • Gracias por la respuesta.

    Por lo que veo no tengo un archivo .edmx. Tengo un archivo context donde configuro los dbset para mapear con la BD.

    luego en el controlador instancio context  db= new context();

    lunes, 27 de febrero de 2012 16:33
  • Si usas EF-Code-First siempre puedes añadir esta propiedad (con el atributo) a tu entidad "NumeracionDocumento":

    [Timestamp]
    public Byte[] Timestamp { get; set; }

    Y luego puedes ejecutar tu operación de esta forma:

    try
    {
    	var numero = from p in db.NumeracionDocumentos where p.TipoDoc ==tipoDocumento selec p;
    	numero.UltimoIngresado = numero.UltimoIngresado + 1
    	db.Entry(NumeracionDocumento).State = EntitySatate.Modified;
    	db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
    	// recoge la excepcion de concurrencia
    }

    Así podrás encontrar problemas de concurrencia en el registro de la base de datos...

    Un saludo,


    Fernanando Escolar - http://www.programandonet.com/ - @fernandoescolar

    • Propuesto como respuesta Nicoloco martes, 28 de febrero de 2012 2:05
    • Marcado como respuesta sepilrat miércoles, 29 de febrero de 2012 0:46
    lunes, 27 de febrero de 2012 16:55
  • Hola.

    Exacto, la forma recomendada para el trabajo de la concurrencia pesimista es ese, trabajando con los Timestamp que generan claves unicas luego de cualquier operacion con la tabla, luego solo deberas capturar la excepcion y obligar al usuario a refrescar para obtener la ultima version de la informacion.

    Saludos.


    Nicolás Herrera
    Bogotá - Colombia
    BLOG - Leader Group BogotaDotNet
    "Daría todo lo que sé, por la mitad de lo que ignoro." Rene Descartes

    martes, 28 de febrero de 2012 2:07