我怎样才能让NHibernate意识到一流的;空对象";,没有数据库持久性?

我怎样才能让NHibernate意识到一流的;空对象";,没有数据库持久性?,nhibernate,fluent-nhibernate,nhibernate-mapping,null-object-pattern,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Null Object Pattern,我想在我的域中使用空对象模式,但我不想在数据库中有与其相关的记录——我更希望NHibernate能够将SQL空值映射到空对象,反之亦然 这是否可能(使用Fluent NHibernate进行映射) 另外,这似乎是人们希望解决的一个相当普遍的问题,但我想知道为什么我一直在努力寻找答案 编辑: 从这篇博文判断,它看起来不可能直接实现:在not fluent nhibernate中,您可以使用导入映射,该映射不会像这样持续到数据库 <hibernate-mapping xmlns="urn:nh

我想在我的域中使用空对象模式,但我不想在数据库中有与其相关的记录——我更希望NHibernate能够将SQL空值映射到空对象,反之亦然

这是否可能(使用Fluent NHibernate进行映射)

另外,这似乎是人们希望解决的一个相当普遍的问题,但我想知道为什么我一直在努力寻找答案

编辑:
从这篇博文判断,它看起来不可能直接实现:

在not fluent nhibernate中,您可以使用导入映射,该映射不会像这样持续到数据库

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
      namespace="MyProject.MiddleTier"    
      assembly="MyProject.MiddleTier">
   <import class="ThingNotToPersist"/>
</hibernate-mapping>


我不知道这是如何用流利的语言表达的,但希望它能给你一个开始。

答案是。。。你不能。Oren说,“NHibernate的空概念不是你可以轻易改变的,它不需要通过拦截器来改变。你可以将空对象用于值类型(使用UserType),但不能用于实体。”

好吧,既然这个问题已经发布了,NHibernate 3已经发布了——也许现在有什么可能了

我不想就此罢休——我想使用空对象模式,我不会满足于“你不能”,所以让我们想想实现这一点的方法吧

我在网上的几篇文章和笔记中遇到的一个想法是使用两个属性——一个是公共(未映射)属性,另一个是私有(映射)属性——因此公共属性的get访问器类似于
return MyPrivate??MyType.NullObject
。。。我已经消除了这个想法,因为它会给查询接口带来问题——您不能查询公共属性,因为它没有映射。所以我们可以忘记这种方法

我有两个想法我在任何地方都没有见过:

使用拦截器在读/写之前/之后更改属性值。

有人提到拦截器不起作用,但请容忍我。。。在伪代码中:

class Foo
{
    public Bar Bar { get; set; }
}

class Bar
{
    public static Bar None;
}

class MyInterceptor
{
    public void AfterLoad(IEntity object)
    {
        foreach (property in object)
            if (property.type == typeof(Bar) && property.value == null)
                object[property].value = Bar.None;
    }

    public void BeforeSave(IEntity object)
    {
        foreach (property in object)
            if (property.type == typeof(Bar) && property.value == Bar.None)
                object[property].value = null;
    }

    public void AfterSave(IEntity object)
    {
        foreach (property in object)
            if (property.type == typeof(Bar) && property.value == null)
                object[property].value = Bar.None;
    }
}
简而言之,在加载时用null对象替换null;保存前,用实际空值替换空对象,保存后,替换回空对象

当使用查询API时,当然需要查询实际的空值,但是如果在查询API上有某种类型的条件生成器或工厂类,则可以在那里说明这一点

将您的类型扩展为专用的空对象类型,并使其成为非持久性的。不知何故。

只是一个想法——假设您要将您的类型扩展为一个专用的空对象类型。大致如下:

class Bar
{
    public static NullBar; // instace of NullBar
}

class NullBar : Bar
{
    // ...
}
既然NullBar是一个专用的类型扩展条,那么我们是否可以告诉NHibernate不要映射Nullar类型,即使它扩展了已映射的Bar

这些都是我的想法——这两个听起来都有道理吗


(顺便说一句,我是一个NHibernate noob,但我是一个执着的人,并不是说你可以把我留到后面去。)

谢谢,我不太确定如何将此应用于空对象模式。嗯,对不起,我在我的工作中没有真正应用此模式。我将此技术与iCiteria结合使用,从收藏中获取最新的对象。在针对映射的持久对象的查询中,我使用投影获取最新的对象,然后使用Treansformer将持久对象转换为映射的非持久等价对象。我真的不能说得更详细了,但是我在这里得到了帮助,当我找到它时,我会发布一个链接。在这里