是否可以用NHibernate急切加载外来自然键?

时间:2011-08-05 22:05:53

标签: c# nhibernate lazy-loading eager-loading

例如,假设我有两个表,ProductOrder。产品包含IDNameDescriptionCost和其他详细列。订单包含IDProductID列(假设订单只能包含一个产品)。

当在系统中显示订单列表时,我还希望显示相关的产品名称,而不显示所有其他数据(即,急切地加载订单及其相关的产品名称,并懒洋洋地加载所有其他产品属性):

SELECT o.ID, o.ProductID, p.Name FROM Order o JOIN Product p ON o.ProductID=p.ID

如果我使用NHibernate执行此操作,我有两个选择:急切加载或延迟加载。

随着加载的热情,我得到了类似的东西:

SELECT o.ID, o.ProductID, p.ID, p.Name, p.Description, p.Cost, p.... FROM Order JOIN Product p ON o.ProductID=p.ID

使用延迟加载,我会得到类似的内容:

SELECT o.ID, o.Product ID from Order
....
SELECT p.Name, p.Description, p.Cost, p.... FROM Product p WHERE p.ID=?

更新

这是我想要实现的更具体的例子。我正在使用现有的DAL并尝试集成NHibernate。当前DAL的一个功能是它允许检索一些基本外键信息作为父记录的一部分。假设有一个User表和一个Region表。每个用户都有一个外键到他们所在的区域。在GUI中显示用户信息时,应该与用户一起显示区域名称,但不需要有关该区域的其他详细信息。

在当前的DAL中,User域对象的成员类型为ForeignKeyReference<Region>

public class ForeignKeyReference<T>
{
    public virtual int ForeignKeyID { get; set; }
    public virtual string ForeignNaturalKey { get; set; }
    public virtual T Reference { get; set; }
}

从数据库中检索User时,还会检索Region的主键和自然键,并将Reference设置为代理对象。我想用NHibernate简化这个,但仍然保持这个功能。例如,我想删除ForeignKeyReference<Region>成员,只有一个Region成员,这是一个NHibernate代理。在此代理上,我希望能够检索ID和名称,而无需再次访问数据库。

1 个答案:

答案 0 :(得分:0)

您可以将特定列标记为惰性列。 Ayende wrote去年关于这个新功能。

我建议您阅读有关此功能的Hibernate文档:

  

Hibernate3支持延迟获取各个属性。这个   优化技术也称为获取组。请注意   这主要是营销功能;优化行读取更多   比列读数的优化更重要。但是,只能加载   在极端情况下,类的某些属性可能很有用。对于   例如,遗留表有数百列和数据   模型无法改进。

另一种选择是改变你自己的问题:

Session.CreateQuery

看看这个answer