C# nhibernate中嵌套实体的优化

C# nhibernate中嵌套实体的优化,c#,nhibernate,optimization,C#,Nhibernate,Optimization,我正在开发一个应用程序,用户可以在其中为数据输入设计自定义表单 我想知道如何以尽可能少的数据库请求加载nhibernate数据 我的域模型: 它们是四个实体 FormProfile-标题、描述、创建日期等 字段组-具有标题和其他属性的字段集 FormField-字段组中的每一行,例如“Zip&Area” 字段属性-表单字段行上的每个输入/选择/单选按钮。例如,用于拉链和区域的文本框 表单结构通常如下所示: FormProfile 现场组 表单字段字段属性 现场组 福尔菲尔德

我正在开发一个应用程序,用户可以在其中为数据输入设计自定义表单

我想知道如何以尽可能少的数据库请求加载nhibernate数据

我的域模型: 它们是四个实体

FormProfile-标题、描述、创建日期等
字段组-具有标题和其他属性的字段集
FormField-字段组中的每一行,例如“Zip&Area”
字段属性-表单字段行上的每个输入/选择/单选按钮。例如,用于拉链和区域的文本框

表单结构通常如下所示:

  • FormProfile
    • 现场组
      • 表单字段
        • 字段属性
        • 现场组
          • 福尔菲尔德
            • FieldProperty
            • FieldProperty

      加载包含所有子项的FormProfile以避免尽可能多的往返db的最佳方法是什么?

      想到两种方法:

      • 使用缓存,以便仅在第一次加载对象时加载对象 请求
      • 使用即时抓取,这将创建 使用外部联接在与其子记录相同的查询中提取子记录 家长

      NHibernate提供了第二级缓存,它在每个SessionFactory中都是持久的(不同于常规的第一级缓存,它在每个会话中都是持久的)。

      IMO的最佳方法是在集合中使用
      批大小属性

      我将假设您的FormProfile类有一个FieldGroups集合,它有一个FormFields集合,它有一个FieldProperties集合

      批量大小
      设置为一个合理的数字(例如,20),这将是一次要查询的
      集合数

      这样,当您获取并导航FormProfile时,您只需要另外3个查询(每个集合类型一个查询)。这些查询又小又快(每个查询只命中一个表,如果定义了一个表,则会在FK上使用索引查找),这通常比使用大型非规范化查询要好


      您还可以在实体和集合上启用二级缓存,以获得更好的性能。

      谢谢,我已经在使用缓存和即时抓取,但我想知道您是否可以以某种巧妙的方式优化nhibernate映射,以一次加载更多数据。用MulitQuery之类的?谢谢!这正是我一直在寻找的解决方案!