Acabo de recibir una excepción TooManyRowsAffectedException mientras trabajaba con NHibernate y he visto soluciones para eso inyectando un dosificador diferente como aquí TooManyRowsAffectedException with encrypted triggers, o modificando los desencadenantes en la base de datos para usar SET NOCOUNT ON (No puedo usar este desde No quiero modificar la base de datos, es muy compleja con más de cien tablas relacionadas entre sí y no quiero meterme con ella, ya que otras aplicaciones la usan). Lo que no entiendo es por qué ocurre esta excepción. Todo lo que hago es que tengo un objeto Sample que tiene un par de valores que verifico, y si los valores se ajustan a un criterio dado, configuro la fila Sample.IsDone en 'Y' (en nuestra base de datos todos los booleanos están representados por un char Y o N). El código es muy simple:¿Cómo decirle a NHibernate que un disparador actualiza otra tabla?
IQueryable<Sample> samples = session.Query<Sample>().Where(s => s.Value == desiredValue);
foreach (Sample sample in samples)
{
sample.IsDone = 'Y';
session.Flush(); // Throws TooManyRowsAffectedException
}
session.Flush(); // Throws TooManyRowsAffectedException
La llamada de Flush arroja si la coloco dentro del lazo o afuera. ¿Hay algo que estoy haciendo mal o solo está relacionado con la forma en que se hace la base de datos? Intenté llamar a SaveOrUpdate() en la muestra antes de Flush(), pero no cambió nada. Sé que puedo evitar esta excepción, pero preferiría entender la fuente del problema.
Nota: En la excepción, me dice que el recuento real de filas es 2 y el esperado es 1. ¿Por qué actualiza 2 filas ya que solo cambio 1 fila?
¡Gracias a todos por su ayuda!
EDIT:
pude descubrir que la causa de ello es porque hay un gatillo en la base de datos de actualización de una fila en la tabla de contenedores (recipientes contienen muestras) cuando se actualiza la muestra. ¿Hay alguna forma de configurar NHibernate para que sepa de este activador y espera que se actualice la cantidad correcta de filas?
No estoy usando Fluent NHibernate, ¿sabe dónde se aplica esto en la configuración de NHibernate? No puedo entender dónde debo escribir eso (no uso ClassMap, ni sé qué es, y no he visto funciones como SqlInsert o similares). – Carl
Consulte la edición de mi respuesta. Con suerte, no estás creando los HBM a mano. Pero si lo es, definitivamente mire lo que Fluent NHibernate o la nueva capacidad de mapeo fluido en NHibernate 3.0 puede hacer por usted. –
Gracias por eso. Sí, estoy creando los HBM a mano, pero no es un problema por ahora (no creo que esto sea particularmente difícil). – Carl