1

我有一个使用复合 id 的数据结构(我不想将其更改为单个),除了多对一连接之外,一切都加载正常,如果连接为空,而不是将属性映射为 null,而是将其映射为空代理对象。我写了一个丑陋的工作(见吹)。有什么解决办法吗?

私有节点_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>
4

1 回答 1

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>

希望这可以帮助,

周杰伦

于 2009-06-23T04:13:04.403 回答