通过代理NHibernate延迟加载集合

时间:2015-09-16 11:12:48

标签: c# linq nhibernate proxy fluent-nhibernate

我想使用扩展方法向域模型添加功能,只有一个聚合根用于检索关联实体,如下所示:

public class User
{
    public ICollection<Invoice> Invoices {get; set;}
}

它填充在可注射接口

public interface ICurrentUserService
{
    public User GetCurrentUser();
}

然后,例如在控制器中(在我的情况下,这不是SO的快速示例,控制器仍然使用服务),我想这样做:

var invoice = _currentUserService.GetCurrentUser().Invoices.Specific(id); var mapped = _mappingEngine.Map<InvoiceModel>(invoice); return View(mapped);

Specific(id)是一种扩展方法:

public static Invoice Specific(this ICollection<Invoice> invoices, Guid id)
{
    return invoices.SingleOrDefault(i => i.Id == id);
}

然而,这种方法会导致一些问题,最令人担忧的是,在第一次访问集合时,即使您所做的只是LINQ操作,也不会枚举项目,整个已加载子项列表(除非指定ExtraLazy并且您只执行Count())。我想要发生的是,代理仍然是代理,直到它实际上必须获得最终的项目/集合(因为一些扩展方法,这将涉及返回集合)。

我想要发生的事情是,在扩展方法中调用SingleOrDefault之前,不会查询数据库,并且当查询数据库时,查询将是样式的'where InvoiceId = ? and UserId = ?'的{​​{1}},而不是在加载整个集合后在内存中完成的位置。

这是否可行(流利)NHibernate或我是否想实现梦想?我只是在这里尝试使用这个项目的方法,为域模型提供一个非常流畅的语法。

0 个答案:

没有答案