【问题标题】:How to ignore lazy="false" mapping?如何忽略lazy="false" 映射?
【发布时间】:2013-04-20 18:03:37
【问题描述】:

我有以下课程:

public class PurchaseOrder
{
   ...
   Store Store { get; protected set; }
   User CreatedBy { get; protected set; }
   User ApprovedBy { get; protected set; }
   ...
}

User 和 Store 类使用lazy="false" 选项进行映射。

<class name="User" lazy="false">

更多的说它们与使用lazy="false" 选项映射的其他一些实体相关联。 而且我不允许更改它。这不是“我的”类,它们属于其他域。

我的问题是,每次我获取 PurchaseOrder 时,它都会对这些类及其依赖项产生额外的查询,从而导致我出现 SELECT N+1 问题。在 99% 的情况下,我不需要所有这些信息 - 存储 id 和用户 id 对我来说就足够了。 尝试使用...

session.CreateCreteria<PurchaseOrder>()
   ...
   .SetFetchMode("CreatedBy", FetchMode.Lazy)
   .SetFetchMode("ApprovedBy", FetchMode.Lazy)
   .SetFetchMode("Store", FetchMode.Lazy)
   ...

.. 但它没有帮助。

如何强制这些关联变得懒惰并忽略lazy="false"

只是为了清楚。存储在 User 和 Store 类中的信息对我的域毫无用处。所以我根本不希望它被提取。此外,如果我在查询中加入用户和存储,它将导致对也映射为lazy="false" 的实体的查询链(不要问为什么,我无法更改它)。我符合某些公司的标准并且必须引用这些类(我不喜欢它,但这是一个规则),但我不想获取他们的数据,我想要它懒惰。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    你不能覆盖lazy="false"

    您可以做的与您所做的完全相反:热切地获取(FetchMode.EagerFetchMode.Join,它们是同义词)。

    【讨论】:

    • 我根本不想获取关联用户和存储。
    • 那你就得和那个创建映射的白痴谈谈了。如前所述,它不能被覆盖。或者,您可以使用投影,但您将丢失所有形式的更改跟踪、身份映射等。建议阅读(供您和您的同事使用):ayende.com/blog/4573/nhibernate-is-lazy-just-live-with-it
    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 2013-12-26
    • 1970-01-01
    • 2021-02-24
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多