1

我有一个按层次结构设置的表(下面是我的域对象)。问题是在处理任何返回的 nhibernate 对象时,它们是基类型的代理。

我找到了这个答案(以及其他一些答案),但是这个也给出了这篇文章的链接,以免丢失延迟加载。

问题

但是,在尝试将泛型方法放在返回类型参数类型的基类上的文章建议之后,我收到一个新错误

错误: “不能对 ContainsGenericParameters 为真的类型或方法执行后期绑定操作。”

注意:我知道我可以在映射中关闭延迟加载,但如前所述,我试图利用不丢失延迟加载的优势。

nHibernate 版本:3.3.1.4000 流畅的 nhibernate 版本:1.3.0.733

public class ItemBase : IItemBase
{
    public virtual int Id { get; set; }
    public virtual int Version { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }

    public virtual T As<T>() where T : ItemBase
    {
        return this as T;
    }

    //removed for brevity 
}
public class Item : ItemBase
{
   public virtual Store Store { get; set; }
}

public class VendorItem : ItemBase
{
    public virtual Vendor Vendor { get; set; }
}

我错过了什么可以解决这个问题?

更新

为了增加这个问题,如果我使用会话中的 Nhibernate“Unproxy”方法:

NhSession.GetSessionImplementation().PersistenceContext.Unproxy

这仅在同一会话中有效。但是,在一种情况下,我们尝试在原始会话之外进行访问,但出现错误:对象是未初始化的代理

4

3 回答 3

2

答案实际上需要使用访问者模式。NHibernate 的返回类型是基类的代理,因此任何转换为​​所需类型的尝试都是不可能的。访问者模式允许您通过多态性来识别您所追求的对象的类型。

于 2013-09-30T12:17:10.670 回答
0

.NET 版本是什么?我记得 .NET 3.5 中具有泛型参数的类的动态代理存在一些问题。顺便说一句,当关联的会话不再存在时,访问代理的卸载属性将出现异常,因此即使您解决了第一个问题,Unproxy() 的第二个问题仍然存在。

于 2013-09-09T07:34:16.000 回答
0

您是否尝试过使用以下内容?

NHibernateUtil.Initialize(myobject)
于 2013-09-04T16:24:12.737 回答