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