Nhibernate中具有复合ID的意外代理对象

时间:2009-01-12 13:00:50

标签: nhibernate null proxy-classes composite-key

我有一个使用复合ID的数据结构(我不希望将其更改为单个) 除了多对一连接之外,所有内容都加载正常,如果连接为空,而不是将属性映射为null,则将其映射到空代理对象。我写了一个丑陋的工作(见bleow)。任何解决方案吗?

私有节点_Parent;

    public Node Parent
    {
        get
        {
            return this._Parent;
        }
        set
        {
            this._Parent = Proxy.Check<Node>(value);
        }
    }
internal static class Proxy
{
    public static T Check<T>(T obj) where T : PersistentObject
    {
        if (obj is NHibernate.Proxy.INHibernateProxy && obj != null)
        {
            try 
            {
                int id = obj.ID;
                return obj;             
            }
            catch //Proxy only object cant retrieve ID
            {
                return null;
            }
        }
        else
        {
            return obj;
        }
    }

}

以映射文件开头

<class name="Node" table="Node">
    <composite-id>
        <key-property name="ID"/>
        <key-property name="VersionID"/>
    </composite-id>

并通过

访问
    <many-to-one name="Node" class="Node" >
        <column name="NodeID"/>
        <column name="VersionID" />
    </many-to-one>

1 个答案:

答案 0 :(得分:2)

不完全确定这是否是针对这种情况的完美修复,但是当我在使用复合键处理旧数据库时遇到同样的问题时,这解决了我的问题。

通过在链接上设置not-found忽略,NHibernate会将空对象视为null而不是异常。当使用这种技术时,NHibernate将执行单独的查询,因此可能会有小的性能命中,因为这基本上是急于加载对象。

你可以尝试只是急于加载对象而不是使用这种技术,但我觉得它会返回一个异常,因为它会期待一个对象(不是null)。我建议在NHibernate论坛上发帖提问,如果这不起作用,因为我肯定不是这方面的专家,但这对你来说可能是一个更小/更难看的工作。

例如:

<many-to-one name="Node" class="Node" not-found="ignore">
    <column name="NodeID"/>
    <column name="VersionID" />
</many-to-one>

希望这有帮助,