ASP.Net MVC,ORM和“重”对象

时间:2009-09-01 15:50:24

标签: asp.net-mvc nhibernate

我认为这个问题在具有中型模型的Web应用程序中很常见。 假设我有一个SportCenter课程,其中包含一个BasketballField列表 显示我还想展示的BasketballField的预订或属性 关于它所属的SportCenter的信息很少。

我正在使用ASP.Net MVC和nHibernate作为数据层,所以我的问题是: 是否值得让nHibernate加载整个SportCenter实例(实际上 包含的集合是延迟加载但仍然是“重”的类 我的BasketballField和它的信息只是为了显示几个领域 SportCenter?

另一方面,在HQL中构建非常精细的查询会让我回到过去 使用手工SQL查询的经典ASP日......

建议的最佳做法是什么?

谢谢大家,彼得。

5 个答案:

答案 0 :(得分:2)

试一试,运行它,对它进行分析。尝试两种方式,并使用Red Gate's ANTS Profiler之类的配置文件来查看是否存在明显的性能差异。

如果没有那么大的区别,那么使用更易读的 - 使用SportCenter类 - 否则,使用HQL。

IMHO,OR / Ms,在当前状态下,并不是SQL /变种的完全替代品。

答案 1 :(得分:0)

如果您从BasketballField结束查询,那么每个BasketballField都可以“获取加入”SportCentre,或者从BasketballField结束时关闭延迟加载(因为每个BasketballField只有一个SportCentre)。

我遇到的主要开销来自于nHibernate使用大量小的延迟加载来破坏数据库,解决方案通常是让它在单个往返中返回所有数据。

答案 2 :(得分:0)

我正在成为命令/查询分离(Greg Young版本)的坚定信徒,所以我想如果你想向用户显示数据(查询),你绝对不应该使用你的域模型。当涉及到良好的领域时,吸气剂往往是一种反模式。

我目前首选的流程是使用由NHibernate填充的屏幕特定DTO。这些在从单独的表驱动时效果最好,但您可以使用NHibernates AliasToBeanTransformer从域表中填充。

答案 3 :(得分:0)

考虑Linq。 NHibernate支持Linq。使用Linq,可以轻松编写返回“部分对象”的类型安全查询或您想要的任何字段。

您提出的其他两个选项可能“足够好”并且应该有效。

如人们所说,如果你担心表现,请使用探查器。

查看特定的DTO是最佳做法,可能在这里有意义。

答案 4 :(得分:0)

您的问题是您正在将您的域公开给UI层。您应该将模型与ViewModel分开。