【问题标题】:NHibernate many-to-one by formula?NHibernate 多对一的公式?
【发布时间】:2010-11-09 23:13:36
【问题描述】:

我正在使用 NHibernate 2.1.2,并希望使用公式加载多对一关联。

给定一个任意域实体 E[X],有一个计算可以推导出前一个实体 E[X-1] 的主键。我希望将每个实体作为链接列表中的一个节点加载,每个实体都有一个“上一个”属性,该属性使用此公式延迟加载,因此如果我愿意,我可以遍历历史记录。

换句话说,对前一个条目的直接引用不会存储在当前条目中,但可以使用一个公式来计算前一个键。

我尝试为多对一指定“公式”,但当然它失败了,因为“属性映射的列数错误”。对于实现这一目标还有其他建议吗?

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    这最好使用 PostLoadEventListener 来完成。

    【讨论】:

    • 这看起来可行,但在我投入太多工作之前,如何确保“上一个”实体被延迟加载?我已经在映射文件中指定了所有必要的信息,但是我没有看到通过 PostLoadEvent 提供的接口,这些接口允许我指定返回的代理而不是具体的类。
    • 我想我在可通过 PostLoadEvent 类访问的 IEntityPersister 接口中找到了它。感谢您的帮助!
    • 做了一些初步测试,恐怕这些事件侦听器速度太慢了;我说的是比以前的行为慢 3-4 倍,这甚至没有创建代理(只是对加载的对象进行一些类型测试)。我没有看到一种简单的方法来减少数据集以使这种开销变得可控,所以这个解决方案对我不起作用。
    • 我对 3-4 倍的减速感到惊讶。 NHibernate 是根据侦听器在内部实现的。所以我怀疑这是您在侦听器代码中所做的事情。可以发一下吗?
    • OnPostLoad 方法很简单:我做了一个简单的类型测试。问题是正在处理的结果数量很多,所以这个回调被调用了数千次,而之前没有任何开销。我并不惊讶它如此昂贵。这不是放置它的理想路径。但是,似乎我使用的是过时的模式,而我下载的新模式支持多对一的公式。尽管如此,我仍然遇到错误,并且手册中没有关于这种用法的指导。至少可以说令人沮丧。
    【解决方案2】:

    问题是 NHibernate 2.x 系列中的一个错误。我升级到 NHibernate 3.0 beta,问题得到解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多