Как я могу помешать nHibernate от установки значения даты в ненулевом объектном поле, если базовое значение поля базы данных равно нулю? - PullRequest
1 голос
/ 23 февраля 2010

Я с волнением прочитал первую статью, которая появилась в Google - это была именно моя проблема. У меня есть объектная модель с ненулевым полем даты, но базовое поле базы данных было равно нулю и имело нулевое значение. Это был DateTime. nHibernate установил значение в .Net Date.MinValue, затем попытался сохранить его обратно, выдав ошибку.

Решение в статье: просто используйте «DateTime?» в доменной модели.

Это не сработает для нас.

Вот в чем дело: мы проводим крупный рефакторинг, который включает в себя миграцию данных из одной схемы в другую, переход от ADO к nHibernate и т. Д., Сложные вещи. Итог: объектная модель является правильной, как она есть, это НЕ обнуляемый DateTime («CreatedDate»). Установка его в DateTime? будет работать технически, но это неверно. Чего я действительно хочу, так это чтобы nHibernate перестал быть таким полезным и просто выдавал ошибку, когда сталкивался с попыткой загрузить нулевой DateTime в необнуляемый объект домена. Я считаю, что это поможет нам быстрее выявить эти проблемы.

Я знаю, что nHibernate очень настраиваемый / сопоставляемый ... есть ли способ добиться такого поведения, и как лучше всего это сделать ...?

Заранее спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 23 февраля 2010

Является ли DateTime.MinValue полезным для вас значением?

Разве вы не можете просто реализовать установщик и выдать исключение при получении этого значения?

0 голосов
/ 23 февраля 2010

Лучшее решение - сделать поле необнуляемым в базе данных. Есть ли причина, по которой ты не можешь этого сделать? Важно, чтобы обнуляемость в вашей доменной модели соответствовала схеме базы данных.

Я не знаю, как настроить это поведение с помощью конфигурации. Если это влияет на несколько полей, вы можете скрыть проблему, сопоставив частное поле и управляя им через свойство, но это не даст вам исключения при загрузке. Для этого вам нужно написать реализацию ILoadEventListener (я думаю, что это правильно, я никогда не делал этого).

0 голосов
/ 23 февраля 2010

Похоже, сам столбец не должен быть обнуляемым в базе данных. Одна вещь, которую я видел в прошлом, - это установить по умолчанию столбец «CreateDate» для getdate () в базе данных. Вы также можете реализовать триггер для установки CreateDate на getdate () при вставке записи. Если вы используете значение по умолчанию, значение будет установлено при вставке записи (если вы явно не передаете ее), и Hibernate сможет вернуть ее вам после сохранения или при следующем поиске запись.

...