Обнуляемый DateTime в NHibernate 2.0.1 - PullRequest
       13

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

0 голосов
/ 27 февраля 2009

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

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

    открытый класс AuditInterceptor: EmptyInterceptor { public override bool OnSave (тип объекта, идентификатор объекта, состояние объекта [], строка [] propertyNames, типы IType []) { var auditable = сущность как 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.9999 11:59:59 PM

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

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

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

Понятно, не работает:

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

1 голос
/ 27 февраля 2009

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

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://stackoverflow.com/questions/593236/nhibernate-2-mapping-files-how-to-define-nullable-datetime-type-datetime

0 голосов
/ 28 февраля 2009
...