transacción y concurrencia
-
2012年2月26日 19:15
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.
すべての返信
-
2012年2月27日 8:14
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
-
2012年2月27日 16:33
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();
-
2012年2月27日 16:55
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
- 回答の候補に設定 NicolocoMVP 2012年2月28日 2:05
- 回答としてマーク sepilrat 2012年2月29日 0:46
-
2012年2月28日 2:07
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

