Две проблемы, которые, вероятно, будут сразу очевидны, но я уже слишком долго их выслеживаю:
Я установил 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.
Что происходит? Что бы это ни стоило, я на самом деле ранее уже настроил прослушиватель событий, и это привело к той же проблеме.
- Теперь о тупом вопросе, на который, должно быть, где-то был дан ответ, но я не могу его найти: как часть решения вышеупомянутой проблемы, я быстро проверил, делает ли 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"/>
Любые указатели приветствуются!