Nhibernate 最佳实践:延迟加载或获取所有属性
关于延迟加载,我有一个问题。为此,我使用LinQ到NHibernate,但我假设它也适用于其他LinQ到XX方法 设想一个带有列的用户选项卡: 身份证 名称 住址 此示例的密码:普通,非散列 想象一个角色表: 身份证 名字 当然,还有多对多表UserRole和其他信息,比如CreateDate 当您只想获取特定用户的角色名称时,您可以通过以下查询通过快速加载来完成此操作:Nhibernate 最佳实践:延迟加载或获取所有属性,nhibernate,lazy-loading,eager-loading,Nhibernate,Lazy Loading,Eager Loading,关于延迟加载,我有一个问题。为此,我使用LinQ到NHibernate,但我假设它也适用于其他LinQ到XX方法 设想一个带有列的用户选项卡: 身份证 名称 住址 此示例的密码:普通,非散列 想象一个角色表: 身份证 名字 当然,还有多对多表UserRole和其他信息,比如CreateDate 当您只想获取特定用户的角色名称时,您可以通过以下查询通过快速加载来完成此操作: var roles = session.Query<User>().FetchMany(u => u.Us
var roles = session.Query<User>().FetchMany(u => u.UserRoles)
.ThenFetch(ur => ur.Role)
.Single(u => u.Id == userId)
.UserRoles.Select(ug => new { ug.Role.Name } );
延迟加载:
即时加载的优点是:每次只有1个调用,而不是2个或3个对数据库的调用
急于加载的缺点:即使您说只希望返回名称,查询本身也会导致从数据库中获取所有包含表的所有属性,包括敏感信息,如我们的示例密码,并且一旦进入代码,它将只过滤名称
有人能就这两种方法中的哪一种提供一些建议吗?或者有没有其他方法可以在不加载所有属性的情况下快速加载。请不要对使用存储过程提出任何建议
提前感谢,
Peter关于是否使用延迟加载或快速加载。这实际上取决于您的用户将更经常地做什么。如果你的用户最终接触到你的映射引用超过50%*我不确定这一比例是多少,但现在让我们来讨论一下,那么你应该立即加载。否则,应该使用延迟加载。百分比可能会根据负载产生的成本而有所不同 然而,我想说的是,除非您确实有问题,否则使用大多数ORM的延迟加载的默认行为。坚持第一条座右铭
这至少是我的两分钱:我理解你的想法。但是安全呢?如果(例如银行账号)从数据库中发送到客户机,而客户机实际上并不需要它,这有多危险?数据库和客户端之间的数据传输不安全,或者是否安全?
var roles = session.Query<User>().Single(u => u.Id == userId)
.UserRoles.Select(ug => new { ug.Role.Name } );