Обнуляемое DateTime в NHibernate 2.0.1

Две проблемы, которые, вероятно, сразу станут очевидными, но я уже слишком долго их отслеживал:

  1. Я установил AuditInterceptor для автоматического аудита сущностей, реализующих мой интерфейс IAuditable, который используется следующим образом:

    открытый класс AuditInterceptor: EmptyInterceptor {публичное переопределение bool OnSave (объектная сущность, идентификатор объекта, состояние объекта [], строка [] propertyNames, IType [] типы) {var auditable = entity as IAuditable;

        if (auditable == null)
            return false;
    
        var now = DateTime.Now;
        auditable.CreateDate = now;
        auditable.ModifiedDate = now;
    
        return true;
    }
    
    public override bool OnFlushDirty(object entity, object id, object[] currentState,
        object[] previousState, string[] propertyNames, IType[] types)
    {
        var auditable = entity as IAuditable;
    
        if (auditable == null)
            return false;
    
        auditable.ModifiedDate = DateTime.Now;
    
        return true;
    }
    

    }

Оба поля не допускают значения NULL в базе данных, POCO и файле сопоставления. Однако при сохранении, пока вызывается перехватчик (можно пройти через него и увидеть, что для применимых полей установлено значение DateTime.Now), по-прежнему генерируется исключение SqlDateTime:

SqlDateTime переполнение. Должно быть между 01.01.1753 12:00:00 и 31.12.1999 23:59:59

Я видел это раньше, когда где-то было несоответствие (файл сопоставления, база данных, POCO), где для DateTime указано значение null в некоторых, а не в других. Тем не менее, я проверил, и в этом отношении все хорошо. Я могу вручную установить значения перед SaveOrUpdate (entity), и он без проблем вставляет / сохраняет. Без их ручной установки он действует так, как будто перехватчик вообще пропущен (хотя я знаю, что это не так), а два свойства DateTime никогда не устанавливаются (и поэтому обрабатываются как DateTime.MinValue: 01/01/0001 ...) и поэтому вне досягаемости. Но при переходе значения правильно устанавливаются на DateTime.Now.

Что происходит? Как бы то ни было, я уже настроил прослушиватель событий ранее, и это привело к той же проблеме.

  1. Теперь для глупого вопроса, на который, должно быть, где-то был дан ответ, но я не могу его найти: в рамках решения вышеуказанной проблемы я быстро проверил, делает ли DateTime обнуляемым повсюду, но я знаю одно из критических изменений с NHibernate 2. * - это то, что NHibernate.Nullables больше не поддерживаются. Следовательно, что вы используете в своем файле сопоставления для сопоставления DateTime, допускающего значение NULL? тип? Например:

По понятным причинам не работает:

<property name="CreateDate" column="CreateDate" type="DateTime?" not-null="false" />

И больше не поддерживаются:

<property name="ModifiedDate" column="ModifiedDate" type="Nullables.NHibernate.NullableDateTimeType, Nullables.NHibernate" not-null="false"/>

Будем очень признательны за любые указатели!

Ответов (2)

Решение

Это объясняет:

if (!(entity is IAuditable))
    return false;

DateTime now = DateTime.Now;
state[Array.IndexOf(propertyNames, "CreateDate")] = now;
state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;

return true;

Но все еще не знаете, как 2. * объявить DateTime? в файлах отображения NHibernate.

[Обновление] Задал другой вопрос и получил ответ: https://answacode.com/questions/593236/nhibernate-2-mapping-files-how-to-define-nullable-datetime-type-datetim e

Ответ на ваш второй вопрос:

NHibernate 2. * файлы сопоставления: как определить тип DateTime, допускающий значение NULL (DateTime?)?