加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 我可以(并且应该)强制NHibernate将来的查询在某

发布时间:2020-12-16 03:26:05 所属栏目:asp.Net 来源:网络整理
导读:我在MVC 3 Web应用程序中使用NHibernate将来的查询,并试图在我的控制器中保持所有数据库访问,而不是在我的视图中.该站点是资源(描述性模糊)的目录,其具有多对多的成绩集合以及多对多的主题集合.用户选择一个或多个成绩,以及一个或多个主题,然后获取匹配资源
我在MVC 3 Web应用程序中使用NHibernate将来的查询,并试图在我的控制器中保持所有数据库访问,而不是在我的视图中.该站点是资源(描述性模糊)的目录,其具有多对多的成绩集合以及多对多的主题集合.用户选择一个或多个成绩,以及一个或多个主题,然后获取匹配资源的列表.

为了填充搜索表单,我正在使用将来的查询来获取所有成绩和主题:

public Domain.SearchFormData GetSearchFormData()
    {
        // Get all grades and all topics using a multiquery.

        IEnumerable<Grade> grades = Session.QueryOver<Grade>()
            .Future();

        IEnumerable<Topic> topics = Session.QueryOver<Topic>()
            .Future();

        var result = new SearchFormData();
        result.Grades = grades;
        result.Topics = topics;
        return result;
    }

这非常简单并且工作正常,并返回一个SearchFormData,这是一个简单的DTO.此查询在控制器中执行,结果不需要任何进一步处理,因此它会直接传递到视图中以呈现为复选框列表.

但是由于未来查询的延迟执行,在视图开始迭代列表之前不会触发数据库访问.一些人(如NHibernate Profiler)认为这是一个禁忌,他们说,在视图开始渲染时,应该完成所有数据库访问.主要原因是,如果不这样做,很容易隐藏SELECT N 1.

这不适用;等级和主题都是没有集合的简单对象.我不介意该视图将触发数据库访问.但它让我寻找一种干净,清晰的方式来触发所有未来的查询.一种方法是访问结果,例如将IEnumerable复制到列表中.但那不是我需要做的事情;我只想执行排队查询.

我认为触发器在上面的查询之外发生是有意义的.我可能需要其他数据来呈现整个页面视图,我可能正在使用其他未来的查询来获取它.例如,主页还可能显示五个最受欢迎的资源和资源总数.然后控制器将调用多个方法来累积视图所需的内容,并且最有效的是一次执行所有这些方法.当然,一种方法是将我的GetSearchFormData扩展为GetAllHomePageData并返回一个DTO,其中包含主页上所有内容的字段.但我使用搜索表单,而不仅仅是在主页上.所以我会以这种方式失去一些很好的模块化.

解决方法

我认为对此最好的“解决方案”不是在视图模型类中使用IEnumerable – 为什么不使用简单的数组?这将迫使您在控制器中完全填充模型,并且不会失去Linq功能等.

第二个问题是您直接在SearchFormData中使用域实体(等级,主题) – 您应该使用DTO.你提到SearchFormData是DTO,但这并不完全正确,因为它引用了你的域实体.

所以SearchFormData看起来像这样:

public class SearchFormData
{
  public GradeDTO[] Grades { get; set; }
  public TopicDTO[] Topics { get; set; }
}

你真正的问题是设计相关的问题,而不是NHibernate Futures问题IMO.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读