NHibernate: переполнение SqlDateTime при удалении объекта

#nhibernate #sqldatetime

#nhibernate #sqldatetime

Вопрос:

Я пытаюсь удалить объект и получаю исключение SqlTypeException: переполнение SqlDateTime.

Итак, сегодня я активировал свойство «Show SQL» в конфигурации и, к своему удивлению, обнаружил, что при попытке удалить этот объект NHibernate фактически выполняет обновление, которое приводит к ошибке, потому что мое свойство DataTime имеет недопустимое значение. Вопрос в том, почему NHibernate пытается обновить объект перед операцией удаления? Вот мой код:

   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; 
                } 
            } 
  

Это мое отображение:

 <?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>
  

И это результат, который я получаю, когда я фиксирую изменения с помощью приведенного выше
код:

 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
  

Сначала обновляется два разных объекта… и ни один из них не является
тот, который я хочу удалить, идентификатор объекта, который я предоставляю для удаления
равно: 4601
Пожалуйста, любая помощь с этим будет высоко оценена.

Ответ №1:

NHibernate обновляет эти объекты, поскольку используемый вами сеанс в какой-то момент загрузил их. Когда он загрузил их, они были сохранены в кэше 1-го уровня. Затем впоследствии они были изменены. Когда вы затем фиксируете свою транзакцию, NHibernate сбрасывает сеанс, тем самым проверяя, не являются ли какие-либо объекты в его кэше «грязными» (т. Е. нуждаются в обновлении), и обновляет любой из этих объектов.

Поэтому проверьте, загружаете ли вы эти объекты в какой-то момент в течение жизненного цикла вашего сеанса.

Комментарии:

1. эти объекты загружались с тем же ISession прямо перед тем, как я попытался удалить один из них. Но я уверен, что я ничего не изменял. В любом случае, я попытаюсь просмотреть код, чтобы убедиться, что я не обновляю объекты.

2. @jhenriquez, возможно, вы не изменяете их явно, но если некоторые значения обнуляются в базе данных, но не обнуляются в вашей модели (похоже, Ingreso) NHibernate подумает, что значение изменено.

3. Большое спасибо! вы указали мне правильное направление. Учитывая мою текущую ситуацию, я решил использовать другой сеанс только для удаления объекта, поэтому ему не нужно удалять какие-либо изменения.