我正在构建一个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中,根据类称为xxxRecord的约定,为您创建NHibernate映射,并且存在一个具有相同名称的数据库表。
所以你没有(据我所知)有一个你可以指定的映射文件。如果我是对的,那么问题是是否有任何方法可以指定你想要加载用于检索客户端的查询(更像是Entity Framework的“包含”方法)。
答案 0 :(得分:1)
你必须在你的nHibernate映射文件中指定预先加载,使用Fluent nhibernate这样看起来像这样:
HasMany(x => x.EventRecords).KeyColumn("CompanyId").Not.LazyLoad().Fetch.Select();
Fetch.Select()
将执行第二个select语句来加载所有相关的事件记录。
Not.LazyLoad()
告诉nHibernate立即执行第二个选择,如果删除此执行将被推迟到访问该集合。
在回复您的评论时,您还可以使用fetch指定查询中的预先加载(显示LINQ示例)
NHSession.Query<ClientRecord>().Fetch(c => c.EventRecords).ToList();