Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 最佳实践:延迟加载或获取所有属性_Nhibernate_Lazy Loading_Eager Loading - Fatal编程技术网

Nhibernate 最佳实践:延迟加载或获取所有属性

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

关于延迟加载,我有一个问题。为此,我使用LinQ到NHibernate,但我假设它也适用于其他LinQ到XX方法

设想一个带有列的用户选项卡:

身份证 名称 住址 此示例的密码:普通,非散列

想象一个角色表:

身份证 名字

当然,还有多对多表UserRole和其他信息,比如CreateDate

当您只想获取特定用户的角色名称时,您可以通过以下查询通过快速加载来完成此操作:

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 } );