我使用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没有查看我已经读过的缓存,因为缓存只能使用主键进行查找。我希望还有另一种方法可以实现这一点,因为这会严重影响我的应用程序的性能。
更改数据库对我来说不是一个选择。我有什么可以做的吗?