0

如果有任何区别,我将如何使用由 fluent nhibernate 配置的 nHibernate在某些情况下使用自然/备用键加载实体,而不是在LoadISession 上使用该方法时使用主键。

我仍然需要允许我同时执行这两种操作的功能,并且在大多数情况下,实体将通过 PKey 加载,但在某些情况下(涉及外部系统),我需要使用自然选择记录钥匙。

我想保持性能优势Load,而不是进行查询等。

 // Current
 int countryID = 1; // from normal input source

 Address a = new Address();
 a.Country = session.Load<Country>(countryID);

 session.SaveOrUpdate(a);

 // Required
 string countryCode = "usa"; // from external input source

 Address a2 = new Address();
 a2.Country = session.LoadViaNatualKeySomehow<Country>(c=> c.Code, countryCode); // :)

 session.SaveOrUpdate(a2);
4

1 回答 1

4

AFAIK,这是不可能的。正如您在Ayendes post中看到的那样,有一个条件查询语法,据我所知,这是整个 NHibernate API 中唯一的自然 ID。此查询转换为“正常”查询,除了本文中描述的二级缓存处理。

如果它至少不会刷新会话,那就太好了。

您可以做的一项简单的性能增强是在通过(不可变的!)自然 ID 查询之前关闭自动刷新:

session.FlushMode = FlushMode.Never;
session.CreateQuery(...by natural id ...);
session.FlushMode = FlushMode.Auto;

这可以产生很大的不同,但当然不会与 Load 竞争。

它不存在的原因很可能是会话中的实体都由 id 标识。

如果你有它:

var entity1 = session.Load<Entit>(id);
// does not exist
var entity2 = session.LoadByNaturalKey(natural id);

NH 如何确定 id 和自然 id 标识的是同一个对象,而不从数据库中加载它们?整个会话缓存陷入困境。

于 2012-04-05T14:40:26.043 回答