首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Nhibernate标准中指定关联深度

在Nhibernate标准中指定关联深度
EN

Stack Overflow用户
提问于 2013-08-28 18:34:30
回答 1查看 192关注 0票数 0

好吧,假设我有很多对很多的,学生/类对象。使用以下映射

代码语言:javascript
复制
      HasManyToMany(m => m.Classes)
                .Table("StudentClasses")
                .LazyLoad()
                .Cascade.None();

并询问:

代码语言:javascript
复制
       return _session.CreateCriteria<Student>()
                               .Add(Restrictions.Eq("Id", studentId))
                               .SetCacheable(false)
                               .UniqueResult<Student>();

我的桌子

代码语言:javascript
复制
    ID | Student           ID | Class              StudentId | ClassId
    ============           ===========             ===================
    1  | John              1 | Algebra             1         | 1
    2  | Sue               2 | Biology             1         | 2
    3  | Frank             3 | Speech              2         | 2
    4  | Jim               4 | Athletics           2         | 5
    5  | Frankenstein      5 | History             5         | 5

我想要的是 John,随着代数和生物学的到来,但是生物学伴随着John和Sue,她反过来又给了我Bio和History,后者是苏和Frankenstein的聚集地。你不会想要科学怪人(或生物学以外的任何东西)。而且,在任何时候,你都可以开始循环循环。

我怎么才能规定不深入地填充呢?SetMaxRows显然不是我想要的,因为它减少了总行数,我只想补充第一个级别。我特别困惑,因为我认为LazyLoading会迫使我指定我到底想要补充什么

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-30 01:09:52

延迟加载允许您不必指定要水合物的内容。当您访问这些集合时,它们将被“懒散地”填充。上面的查询将只获取一行: John。当您访问john.Classes时,NHibernate将在幕后执行另一个查询来获取John的类。然后,当您访问biology.Students属性时,NHibernate将执行另一个查询来填充该集合.诸若此类。

您确实希望延迟加载这种关系(顺便说一句,这是默认的)。如果您关闭了延迟加载,那么这将实现您想要避免的结果-- NHibernate将知道它不允许懒散地加载这些集合,因此,一旦您加载了一个学生,它就会开始加载它们,这可能会导致在这三个表中加载所有数据,并且以一种非常低效的方式加载大量往返数据库。

如果您知道您想要的只是"John,with代数和生物学“,那么您应该在查询中添加以下几行:

代码语言:javascript
复制
    .SetFetchMode("Classes", FetchMode.Eager)
    .SetResultTransformer(Transformers.DistinctRootEntity)

SetFetchMode告诉NHibernate使用左外部联接预填充student.Classes集合。DistintRootEntity告诉NHibernate不要返回由左外部联接生成的重复学生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18495671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档