asp.net-mvc – 我可以(并且应该)强制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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – .NET接口签名
- MSChart和ASP.NET MVC部分视图
- asp.net-mvc – ASP.NET MVC的一个路由,两个不同的视图
- asp.net-mvc-5 – “确认密码”和“密码”不匹配. MVC5
- asp.net-mvc – ASP.NET MVC – 出错时的声明性重定向
- asp.net-mvc – 处理CORS预检请求到ASP.NET MVC操作
- ASP.NET连接字符串加密/保护
- asp.net-mvc-3 – ReSharper无法解析Razor
- 什么时候用ASP.NET MVC来淘汰JavaScript
- asp.net-mvc – 在mvc4中的下拉列表更改事件中提交表单
- asp.net-core – ASP.NET核心添加视图参数名称路
- asp.net – 我被困在UpdatePanel陷阱中
- asp.net – 当引发CacheItemRemovedCallback时,H
- asp.net-mvc – 使用MVC Framework RC1更新断开连
- 有没有办法以编程方式设置ASP.NET Universal Pro
- IIS ASP.NET WebApi在请求同一台服务器时死锁
- asp.net – Response.TrySkipIisCustomErrors不工
- asp-classic – 在ASP Classic应用程序中获取根目
- asp.net – 仅用于字母和数字的正则表达式验证器
- asp.net – 开发和测试环境最佳实践?