【问题标题】:Prevent NHibernate mapping property to a proxy防止 NHibernate 将属性映射到代理
【发布时间】:2013-05-15 02:09:54
【问题描述】:

我正在寻找解决问题的方法,但我得到的只是发生这种情况的原因,而不是阻止这种情况发生。

我有一个类WorkflowActivityInstance,它有一个WorkflowActivityInstanceTransitions 的集合,代表工作流状态的转换。转换映射在 Transitions 属性中。

因此:WorkflowActivityInstance WorkflowActivityInstanceTransition

我想要一个对象的视图,它会给出WorkflowActivityInstance 状态,包括它的当前状态,这只是最新的WorkflowActivityInstanceTransition,而不需要用户编码器在@987654328 上执行自己的排序和选择@属性。

原来,我有:

public virtual IWorkflowActivityInstanceTransition CurrentState
{
    get { return Transitions.OrderBy(q => q.TransitionTimeStamp).LastOrDefault(); }
}

但我只是得到:

NHibernate.InvalidProxyTypeException: NHibernate.InvalidProxyTypeException:以下类型可能不是 用作代理: FB.SimpleWorkflow.NHibernate.Model.WorkflowActivityInstance:方法 CurrentState 应该是“公共/受保护的虚拟”或“受保护的” 内部虚拟'。

我试图厚脸皮并将其转换为一种方法:

public IWorkflowActivityInstanceTransition GetCurrentState()
{
    return Transitions.OrderBy(q => q.TransitionTimeStamp).LastOrDefault();
}

但我得到一个非常相似的:

NHibernate.InvalidProxyTypeException: NHibernate.InvalidProxyTypeException:以下类型可能不是 用作代理: FB.SimpleWorkflow.NHibernate.Model.WorkflowActivityInstance:方法 GetCurrentState 应该是 'public/protected virtual' 或 'protected 内部虚拟'。

我想在我的模型类中保留 CurrentState 的非常简单的行为,并防止 NHibernate 超出自身范围并尝试映射/代理此属性。感觉这应该只是我不想映射的属性上的一个属性...

我怎样才能做到这一点?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    NHibernate 需要覆盖所有公共、受保护和内部方法,否则代理无法工作(您的代码可能会访问尚未初始化的代理)。

    我看不出您的属性不起作用的原因,但您的方法的错误非常明显,您错过了virtual 关键字。

    【讨论】:

    • 谢谢。我知道它需要覆盖我的成员以用于代理目的,特别是用于延迟加载目的。然而,这个特定的成员不会被持久化,因此 NHibernate 没有代理它的业务。我是否明白我不能在模型中添加模型之外的任何东西,即使是为了方便起见?
    • @Program.X 你可以添加任何你想要的属性或方法,它们必须是虚拟的。正如我已经解释过的,NHibernate 需要覆盖所有属性和方法,而不仅仅是映射/持久化的。
    【解决方案2】:

    您必须使用虚拟关键字。这就是 Nhibernate 的工作方式。这个页面也会帮助你。

    Github nhibernate/nhibernate-core

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-05
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多