使用Natural Key加载nHibernate代理

时间:2012-04-05 14:07:10

标签: nhibernate fluent-nhibernate

我如何使用nHibernate,由流畅的nhibernate配置,如果它有所不同,在某些情况下使用自然/备用键加载实体,而不是使用{{1时的主键在ISession上的方法。

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

我希望保持性能优势Load允许,而不是进行查询等。

Load

1 个答案:

答案 0 :(得分:4)

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

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

你可以做的一个简单的性能提升是在通过(immutable!)自然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是否识别同一个对象,而不从数据库中加载它们?整个会话缓存都会遇到麻烦。