NHibernate: Desbordamiento de SqlDateTime al eliminar la entidad

Estoy intentando eliminar un objeto y recibo una SqlTypeException: SqlDateTime Overflow.

Entonces, hoy activé la propiedad "Mostrar SQL" en la configuración, y para mi sorpresa descubrí que cuando intento eliminar esta entidad, NHibernate en realidad hace una actualización que da como resultado el error porque mi propiedad DataTime tiene un valor no válido. La pregunta es ¿por qué NHibernate intenta actualizar la entidad antes de la operación de eliminación? Aquí está mi código:

  using (ITransaction tnx = presentationSession.BeginTransaction()) { 
                try { 
                    presentationSession.Delete(View.SelectedData); 
         /* View.SelectedData has the reference I want to delete. Entity Id: 4601 */
                    tnx.Commit(); 
                } catch { 
                    tnx.Rollback(); 
                    throw; 
                } 
            } 

Este es mi mapeo:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default- 
lazy="false"> 
    <class 
                name="PTFS.Personal.Model.Empleado, PTFS.Personal" 
                table="Supervisores" 
                > 
        <id 
            name="Id" 
            unsaved-value="0" 
            access="field.camelcase" 
            > 
            <generator class="native" /> 
        </id> 
        <property name="Nombre" /> 
        <property name="Supervisor" /> 
        <property name="Cedula" /> 
        <property name="Cargo" /> 
        <property name="Localidad" /> 
        <property name="Traslado" column="DES_TRASLADO" /> 
        <property name="Cambio" column="DES_CAMBIO" /> 
        <property name="FechaTraslado" column="F_TRASLADO" /> 
        <property name="FechaCambio" column="F_CAMBIO" /> 
        <property name="Ingreso" column="F_INGRESO" /> 
        <property name="Egreso" column="F_EGRESO" /> 
        <property name="Sueldo" column="SUELDO_BRUTO" /> 
    </class> 
</hibernate-mapping>

Y este es el resultado que obtengo cuando confirmo los cambios con el código anterior:

NHibernate: UPDATE Supervisores SET Nombre = @p0, Supervisor = @p1, 
Cedula = @p2, Cargo = @p3, Localidad = @p4, DES_TRASLADO = @p5, 
DES_CAMBIO = @p6, F_TRASLADO = @p7, F_CAMBIO = @p8, F_INGRESO = @p9, 
F_EGRESO = @p10, SUELDO_BRUTO = @p11 WHERE Id = @p12;@p0 = NULL, @p1 = 
NULL, @p2 = NULL, @p3 = NULL, @p4 = NULL, @p5 = NULL, @p6 = NULL, @p7 
= NULL, @p8 = NULL, @p9 = 05/09/2005 12:00:00 a.m., @p10 = NULL, @p11 
= 0, @p12 = 3547

NHibernate: UPDATE Supervisores SET Nombre = @p0, Supervisor = @p1, 
Cedula = @p2, Cargo = @p3, Localidad = @p4, DES_TRASLADO = @p5, 
DES_CAMBIO = @p6, F_TRASLADO = @p7, F_CAMBIO = @p8, F_INGRESO = @p9, 
F_EGRESO = @p10, SUELDO_BRUTO = @p11 WHERE Id = @p12;@p0 = NULL, @p1 = 
NULL, @p2 = NULL, @p3 = NULL, @p4 = NULL, @p5 = NULL, @p6 = NULL, @p7 
= NULL, @p8 = NULL, @p9 = 01/01/0001 12:00:00 a.m., @p10 = NULL, @p11 
= 0, @p12 = 4628

Primero está actualizando dos entidades diferentes ... y ninguna de ellas es la que quiero eliminar, la identificación de la entidad que proporciono para eliminar es: 4601 Por favor, cualquier ayuda con esto será muy apreciada.

preguntado el 16 de mayo de 11 a las 17:05

1 Respuestas

NHibernate está actualizando esas entidades porque la sesión que estás usando las había cargado en algún momento. Cuando los cargó, se almacenaron en el caché de primer nivel. Luego, posteriormente, fueron modificados. Cuando luego confirma su transacción, NHibernate vacía la sesión, verificando así si alguna entidad en su caché está "sucia" (es decir, necesita ser actualizada), y actualiza alguna de estas entidades.

Por lo tanto, verifique si está cargando estas entidades en algún momento durante el ciclo de vida de su sesión.

contestado el 16 de mayo de 11 a las 21:05

esas entidades se cargaron con la misma ISession justo antes de que intentara eliminar una de ellas. Pero estoy seguro de que no modifiqué ninguno. De todos modos, intentaré revisar el código para asegurarme de que no estoy actualizando las entidades. - jhenriquez

@jhenriquez, es posible que no los esté modificando explícitamente, pero si algunos valores son anulables en la base de datos, pero no anulables en su modelo (como parece ser Ingreso), NHibernate pensará que el valor está modificado. - Vadim

¡Muchas gracias! me indicaste en la dirección correcta. Teniendo en cuenta mi situación actual, decidí usar una sesión diferente solo para eliminar la entidad, por lo que no es necesario eliminar ningún cambio. - jhenriquez

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.