由于继承,试图处理nHibernate代理类

时间:2013-09-04 12:44:49

标签: c# nhibernate fluent-nhibernate

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

我发现了这个answer(以及其他几个),但是这个也提供了这个article的链接,因为它不会丢失延迟加载。

问题

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

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

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

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

只有在同一会话中才有效。但是,在一种情况下,我们尝试在原始会话之外访问,并且出现错误: object是未初始化的代理

3 个答案:

答案 0 :(得分:2)

使用访客模式实际需要的答案。 NHibernate的返回类型是基类的代理,因此无法进行任何转换为​​所需类型的尝试。访问者模式允许您通过多态性识别对象的类型。

答案 1 :(得分:0)

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

NHibernateUtil.Initialize(myobject)

答案 2 :(得分:0)

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