Nhibernate中的意外代理对象具有复合ID';s
我有一个使用复合ID的数据结构(我不希望更改为单一ID) 除了多对一联接(如果联接为空,则将属性映射为null,而不是将其映射为空代理对象)之外,所有内容都可以正常加载。我写了一本难看的作品(见bleow)。有什么解决办法吗 私有节点_父节点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 {
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>