如何告诉NHibernate在其所有属性都为null时将组件加载为非null?

4

我有一个Date类,它包装了DateTime?类(帮助模拟DateTime.Now,我们的领域等)。

Date类只有一个受保护的属性:DateTime? date

public class Date
{
    protected DateTime? date;
}

// mapping in hbm
<component name="CompletedOn">
  <property column="StartedOn" name="date" access="field" not-null="false" />
</component>

从nhibernate文档中得知:

像所有值类型一样,组件不支持共享引用。组件的空值语义是临时的。当重新加载包含对象时,NHibernate将假定如果所有组件列都为null,则整个组件为null。这对于大多数目的来说应该是可以的。

我能否覆盖此行为?即使日期为null,我也希望我的日期类被实例化。

谢谢。

2个回答

5

我认为您可以通过使用实现IPostLoadEventListener的监听器来实现此行为。在实体加载完成后,您可以检查组件是否为空,如果是,则创建一个新的组件。


1
我为这个解决方案制作了一个概念验证 https://gist.github.com/foka/66f456085769fb8a440dca35bffd0ea6,它可以工作。不过我还没有将其投入生产。 - foka

4

我认为你无法覆盖该行为。

然而,通常情况下,让NH正常工作(检索null)并将其包装在您的域模型中更容易。

但是从我看到的情况来看,你可能是出于演示(数据绑定?)的考虑在做这个。直接公开一个DateTime?不是更容易吗?


无论如何,您都无法模拟静态方法。您应该注入一个“当前时间”服务。您正在尝试在错误的级别处理它。 - Diego Mijelshon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接