【问题标题】:NHibernate and "anonymous" entitiesNHibernate 和“匿名”实体
【发布时间】:2011-06-09 17:37:00
【问题描述】:

我有这些实体:

public class Parent
{
    public int Foo { get; set; }
    public Child C { get; set; }
}

public class Child
{
    public string Name { get; set; }
}

我有从数据库中获取所有父实体的查询。然后我将它们保存在内存中,并使用 LINQ 查询过滤它们。

我注意到,当我执行 DB 查询时,NH 在一个查询中选择所有 Parent 实体(当然会填充 Foo 属性),并且对于我使用 LINQ 访问的每个 Parent,NH 会获取每个 Child 的信息。

如何在一个唯一的数据库中获取我需要的所有信息,并在没有它的情况下通过 LINQ 使用数据来生成额外的数据库行程?

我应该使用 AliasToBeanResultTransformer 吗?如果是这样,我是否必须创建一个 DTO 来存储信息,例如:

public class ParentDTO
{
    public int Foo { get; set; }
    public string ChildName { get; set; }
}

或者我还必须使用 Parent 类吗?

提前致谢

【问题讨论】:

    标签: nhibernate entity


    【解决方案1】:

    您可以像这样急切地为这个查询加载子项(使用 QueryOver 语法)

    public IList<Parent> FindAllParentsWithChildren()
    {
      ISession s = // Get session
      return s.QueryOver<Parent>()
        .Fetch(p => p.C).Eager
        .List<Parent>();
    }
    

    另一种方法是更改​​您的 HBM 文件以指示默认情况下 Child 是热切加载的。那么你就不需要改变你的查询了。

    【讨论】:

      【解决方案2】:

      你需要告诉 NHibernate 不要使用延迟加载来处理 Parent 和 Child 实体之间的关系。

      【讨论】:

      • 我怎么没想到:D
      • 这实际上是个坏主意。使用缓存、批处理和 ad-hoc join-fetching 更好(见 Carl 的回答)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多