例如,假设我有两个表,Product
和Order
。产品包含ID
,Name
,Description
,Cost
和其他详细列。订单包含ID
和ProductID
列(假设订单只能包含一个产品)。
当在系统中显示订单列表时,我还希望显示相关的产品名称,而不显示所有其他数据(即,急切地加载订单及其相关的产品名称,并懒洋洋地加载所有其他产品属性):
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和名称,而无需再次访问数据库。