我们使用 Fluent NHibernate 1.3.0.727 和 NHibernate 3.3.0.4000 将属性映射到数据库中的列。以下是我们的 ClassMap 之一的缩写示例:
public class TankMap : ClassMap<Tank>
{
public TankMap()
{
Id(o => o.Id);
Map(o => o.TankSystem);
}
}
在本例中,TankSystem 属性是一个字符串。
在我们的应用程序的某些部分中,有大量的计算涉及多次访问映射的属性(例如 TankSystem)。当我们分析应用程序时,仅仅访问这些属性就会花费相当多的时间,因为每次访问它们时,都必须通过 NHibernate.Proxy.DefaultLazyInitializer.Intercept 方法。
我们需要尽可能快地进行计算,并希望避免这种代理开销。一种方法是将我们想要的属性(例如 TankSystem)复制到数组中,并在任何时候我们想要访问此信息时使用数组,但这不是一种非常面向对象的方法。
更新:
我们尝试使用 Not.LazyLoad 映射我们的属性,例如:
Map(o => o.TankSystem).Not.LazyLoad();
但是,这似乎对该属性是否实际被代理没有任何影响。
是否有任何类型的选项可以避免/减少这种代理开销?
最佳答案
是的! .Not.LazyLoad()
来救援!
public TankMap()
{
Id(o => o.Id);
Map(o => o.TankSystem).Not.LazyLoad();
}
我找到了一个很好且简短的解释:
You might wonder what the Not.LazyLoad() means. By default Fluent NHibernate defines the mappings to use lazy load. But that also means that all properties of our entities would have to be virtual(Proxies).
关于performance - 如何减少 NHibernate 的属性代理开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419062/