Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate中的意外代理对象具有复合ID';s_Nhibernate_Null_Proxy Classes_Composite Key - Fatal编程技术网

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

Nhibernate中的意外代理对象具有复合ID';s,nhibernate,null,proxy-classes,composite-key,Nhibernate,Null,Proxy Classes,Composite Key,我有一个使用复合ID的数据结构(我不希望更改为单一ID) 除了多对一联接(如果联接为空,则将属性映射为null,而不是将其映射为空代理对象)之外,所有内容都可以正常加载。我写了一本难看的作品(见bleow)。有什么解决办法吗 私有节点_父节点 public Node Parent { get { return this._Parent; } set {

我有一个使用复合ID的数据结构(我不希望更改为单一ID) 除了多对一联接(如果联接为空,则将属性映射为null,而不是将其映射为空代理对象)之外,所有内容都可以正常加载。我写了一本难看的作品(见bleow)。有什么解决办法吗

私有节点_父节点

    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;
        }
    }
公共节点父节点
{
得到
{
返回此项。\u父项;
}
设置
{
此._Parent=Proxy.Check(值);
}
}
内部静态类代理
{
公共静态T检查(T obj),其中T:PersistentObject
{
if(obj是NHibernate.Proxy.INHibernateProxy&&obj!=null)
{
尝试
{
int id=对象id;
返回obj;
}
catch//仅代理对象无法检索ID
{
返回null;
}
}
其他的
{
返回obj;
}
}
}

映射文件开始时


并由

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

不确定这是否是解决这种情况的最佳方法,但这解决了我在使用复合键处理旧数据库时遇到的相同问题

通过在链接上设置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>

希望这有帮助


Jay

请在nhibernate论坛上发布此内容
<many-to-one name="Node" class="Node" not-found="ignore">
    <column name="NodeID"/>
    <column name="VersionID" />
</many-to-one>