当基础数据库字段值为空时,如何阻止nHibernate在非空对象字段上有用地设置日期值?

时间:2010-02-22 23:27:04

标签: .net nhibernate datetime nullable

我兴奋地阅读了谷歌中出现的第一篇文章 - 这正是我的问题所在。我有一个带有非null日期字段的对象模型,但底层数据库字段可以为空,并且具有空值。这是一个DateTime。 nHibernate将值设置为.Net的Date.MinValue,然后尝试将其保存回来,产生错误。

文章中的解决方案:只需使用“DateTime?”在域模型中。

这对我们不起作用。

这就是事情:我们正在做一个主要的重构,其中包括从一个模式到另一个模式的数据迁移,从ADO迁移到nHibernate等等,复杂的东西。底线:对象模型是正确的,它不是可以为空的DateTime(“CreatedDate”)。将其设置为DateTime?在技​​术上会起作用,但这是错误的域名。我真正想要的是nHibernate停止如此有用并且只是在尝试将null DateTime加载到不可为空的域对象时抛出错误。我相信这将有助于我们更快地发现这些问题。

我知道nHibernate是高度可配置/可映射的......有没有办法实现这种行为,最好的方法是什么......?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

DateTime.MinValue对您有用吗?

你能不能简单地实现setter并在获得该值时抛出异常?

答案 1 :(得分:0)

听起来列本身实际上不应该在数据库中可以为空。我在过去看到的一件事是将“CreateDate”列默认为数据库中的getdate()。您还可以在插入记录时实现触发器以将CreateDate设置为getdate()。如果使用默认值,则在插入记录时将设置该值(只要您没有显式传入),Hibernate应该能够在保存后将其返回给您,或者下次查找时记录。

答案 2 :(得分:0)

最佳解决方案是在数据库中使字段不可为空。有没有理由你不能这样做?重要的是,域模型中的可空性与数据库模式匹配。

我不知道通过配置设置此行为的方法。如果这会影响几个字段,您可以通过映射私有字段并通过属性控制它来隐藏问题,但这不会在加载时给出异常。要做到这一点,你必须编写ILoadEventListener的实现(我认为这是正确的,我从来没有这样做过。)