Hola Edgar,
Espero que te sirva, le tuve que hacer adaptaciones así no se mezcla con mi entorno y queda más limpio para vos.
Esta es la clase Numerador:
public class Numerador : EntidadBase
{
private string _nombre;
private int _numeroActual = 0;
protected Numerador()
{
}
public Numerador(string nombre)
{
_nombre = nombre;
}
public string Nombre
{
get { return _nombre; }
}
public int NumeroActual
{
get { return _numeroActual; }
}
public virtual int ProximoNumero()
{
_numeroActual++;
return _numeroActual;
}
}
EntidadBase: Me aporta el Id del tipo GUID.
Este es el mapping (lo hacemo con archivos XML nosotros, pero hay otras formas):
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Modelo" namespace="Modelo"
default-access="field.camelcase-underscore" default-lazy="false">
<class name="Numerador">
<id name="Id">
<generator class="guid.comb"/>
</id>
<property name="Nombre"/>
<property name="NumeroActual"/>
</class>
</hibernate-mapping>
Como podrás ver el Numerador tiene un constructor donde se le pasa el "nombre" y por el cual harías la diferencia sobre lo que quieres manejar. A esta implementación tenés que sumarle que cada vez que obtienes un numerador debes asegurarte de lockear el registro correspondiente. Para eso nosotros usamos lo que se conoce como "repositorios" y la implementación sería algo así:
public Numerador ObtenerUno(System.Guid id, bool locked)
{
if (locked)
return Sesion.Get<Numerador>(id, LockMode.Upgrade);
else
return Sesion.Get<Numerador>(id);
}
Sesion: Contiene el
currentSession. Nosotros usamos SessionPerAction Y para conocer un poco más sobre el tipo de lockeo que hago podes ver este
link.
Y un ejemplo de uso en un Action del Controller sería algo así:
....
var idNumerador = ObtenerIdNumerador("FacturaCliente");
var numerador = _repositorioNumeradores.ObtenerUno(idNumerador, true);
factura.Numero = numerador.ProximoNumero();
....
_repositorioFacturas.Grabar(factura);
_repositorioNumeradores.Grabar(numerador);
...
Creo que no me olvido de nada, espero que te de una idea general de lo que hago. Te repito que actualmente no tenemos un gran nivel de concurrencia.
Nuestro querido Carlos Peix fue de gran ayuda en esta implementación, como así en tantas otras cosas que tenemos en nuestro proyecto. Él es el grande!
Espero que te sirva Edgar y cualquier consulta seguimos en contacto.
Saludos,
César
PD: Guarda con el GASOLERO eh!!!