使用自然ID和多对一缓存

时间:2013-03-02 05:34:10

标签: nhibernate

我使用Nhibernate 3.3映射旧数据库。一个表有一个主键和另一个唯一列。大多数表将使用主键作为外键,因此没有问题。问题是我有一些表格将引用唯一的“友好”列。这是我的映射的简化版本:

<class name="Document">
 <id name="DocumentId">
   <generator class="identity" />
 </id>
 <natural-id mutable="true">
   <property name="DocumentNumber" unique="true" not-null="true" />
 </natural-id>

<class name="Version">
 <id name="VersionId">
   <generator class="identity" />
 </id>
 <many-to-one class="Document" name="Document" property-ref="DocumentNumber" />
</class>

Version表不使用DocumentId而是使用DocumentNumber,因此在多对一映射中使用property-ref。

我的问题是当我测试时通过执行以下操作来使我没有不必要的查询:

var document = this.session.CreateCriteria<Document>()
  .Add(Restrictions.NaturalId().Set("DocumentNumber", 12345))
  .SetCacheable(true)
  .UniqueResult<Profile>();

Assert.AreEqual(12345, document.Version[0].document.DocumentNumber)

我将获得5个将运行的查询。第一个从Document表中获取数据很好。第二个得到版本与配置文件的左外连接有点奇怪。更糟糕的是,我再次在Document表上再查询3次完全相同的查询。

所以似乎NHibernate没有查看我已经读过的缓存,因为缓存只能使用主键进行查找。我希望还有另一种方法可以实现这一点,因为这会严重影响我的应用程序的性能。

更改数据库对我来说不是一个选择。我有什么可以做的吗?

0 个答案:

没有答案