我有一个使用复合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>
答案 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>
希望这有帮助,
杰