【问题标题】:Trying to deal with nHibernate proxy classes due to inheritance由于继承而试图处理 nHibernate 代理类
【发布时间】:2013-09-07 23:31:35
【问题描述】:

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

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

问题

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

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

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

nHibernate 版本:3.3.1.4000 流畅的休眠版本: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 was an uninitialized proxy

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:

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

    【讨论】:

    • 能否请您发布您为解决此问题而生成的代码?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      NHibernateUtil.Initialize(myobject)
      

      【讨论】:

        猜你喜欢
        • 2011-05-29
        • 1970-01-01
        • 2018-10-24
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-24
        相关资源
        最近更新 更多