C# 是否可以急切地用NHibernate加载外部自然密钥?

C# 是否可以急切地用NHibernate加载外部自然密钥?,c#,nhibernate,lazy-loading,eager-loading,C#,Nhibernate,Lazy Loading,Eager Loading,例如,假设我有两个表,Product和Order。产品具有ID、名称、说明、成本和其他详细列。订单具有ID和ProductID列,假设订单只能包含一个产品 在系统中显示订单列表时,我还希望显示关联的产品名称,而不显示所有其他数据,即,急切地加载订单及其关联的产品名称,并惰性地加载所有其他产品属性: SELECT o.ID, o.ProductID, p.Name FROM Order o JOIN Product p ON o.ProductID=p.ID 如果使用NHibernate执行此操

例如,假设我有两个表,Product和Order。产品具有ID、名称、说明、成本和其他详细列。订单具有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=?
通过延迟加载,我得到如下结果:

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的功能之一是,它允许作为父记录的一部分检索一些基本外键信息。假设有一个用户表和一个区域表。每个用户都有其所在区域的外键。在GUI中显示用户信息时,区域名称应与用户一起显示,但不需要有关该区域的其他详细信息

在当前DAL中,用户域对象具有ForeignKeyReference类型的成员


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

您可以将特定列标记为惰性。 Ayende去年对这一新功能进行了介绍

不过,我建议您阅读有关此功能的文档:

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

另一种选择是创建您自己的查询:

Session.CreateQuery

看看这个。

我不清楚这是否适用于联接。单个惰性属性似乎更适用于从特定行加载select数据。我更感兴趣的是检索与行关联的一小部分数据,而不是完整的关联记录。听起来我将不得不使用我自己的查询,这很遗憾,因为这是我希望在多个表上遵循的模式。@Travis:这就是lazy属性。您定义了一些要延迟加载的列。不过,您还有另一个非常难看的选项:您可以映射一个表两次,这样您就得到了一个包含完整列集的表,而只有一个缩减集。您已决定使用哪一个:.internal.JoinAlias=>orderLine.ProductReducedSet,=>Product虽然不是我想要的,但我会将此标记为答案,因为它很有用,并且与更新之前的问题有关。