我如何使用nHibernate,由流畅的nhibernate配置,如果它有所不同,在某些情况下使用自然/备用键加载实体,而不是使用{{1时的主键在ISession上的方法。
我仍然需要允许我同时执行这两项操作的功能,并且在大多数情况下,实体将通过PKey加载,但在某些情况下(涉及外部系统),我需要选择记录使用自然键。
我希望保持性能优势Load
允许,而不是进行查询等。
Load
答案 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是否识别同一个对象,而不从数据库中加载它们?整个会话缓存都会遇到麻烦。