4

我正在构建一个 Orchard CMS 模块,我想在其中预先加载数据,但不知道如何执行此操作。

例如,一个客户有很多事件,所以我有一个 ClientRecord 和 EventRecord 用于这些:

public class ClientRecord {

    private IList<EventRecord> _eventRecords;

    public virtual int Id { get; set; }

    public virtual string Company { get; set; }

    public virtual IList<EventRecord> EventRecords {
        get { return _eventRecords ?? (_eventRecords = new List<EventRecord>()); }
        set { _eventRecords = value; }
    } 
}

当我在我的 ClientController 中加载一个客户端时

var clientRecord = _clientRepository.Get(id);

然后在我的视图中显示事件

    <ul>
        @foreach (var eventRecord in Model.EventRecords) {
            <li>
                @eventRecord.Name (@eventRecord.StartDate.ToShortDateString())
            </li>
        }
    </ul>

显示事件,MiniProfiler 显示一个单独的查询来延迟加载事件。

我尝试在 ClientRecord 中的 EventRecords 集合上放置一个 [Aggregate] 属性,但这没有任何效果。

我对 NHibernate 不是很熟悉,所以希望这很简单,但是我如何指定我想在检索 ClientRecord 时急切加载 EventRecords?

[编辑]

在 Orchard CMS 中,NHibernate 映射是为您创建的,基于类称为 xxxRecord 的约定,并且有一个同名的数据库表。

因此,您(据我所知)没有可以在其中指定的映射文件。如果我是对的,那么问题是是否有任何方法可以指定您希望在查询中预先加载用于检索客户端(很像实体框架的“包含”方法)。

4

1 回答 1

1

你必须在你的 nHibernate 映射文件中指定预先加载,使用 Fluent nhibernate 这看起来(有点)像这样:

HasMany(x => x.EventRecords).KeyColumn("CompanyId").Not.LazyLoad().Fetch.Select();

Fetch.Select()执行第二个选择语句来加载所有相关的事件记录。

Not.LazyLoad()告诉 nHibernate 立即执行第二个选择,如果你删除这个执行将被推迟到集合被访问。

作为对您的评论的回应,您还可以使用 fetch 在查询中指定预先加载(显示的 LINQ 示例)

NHSession.Query<ClientRecord>().Fetch(c => c.EventRecords).ToList();
于 2013-06-26T13:12:15.053 回答