我有一个 MVC3 NHibernate/ActiveRecord 项目。该项目进展顺利,我的模型对象(主要是一个由三四个类组成的巨大层次结构)得到了一些使用。
我的应用程序是基于分析的;我存储层次结构数据,然后将其切片,以图表形式显示等,因此实际关系并没有那么复杂。
到目前为止,我还没有从 ORM 中受益匪浅;它使查询变得容易(ActiveRecord),但我经常需要比完整对象更少的信息,并且我需要通过复杂的多次选择和对集合的迭代来编写“硬”查询 - 原始 SQL 会更快、更干净。
所以我正在考虑在这种情况下放弃 ORM,并返回到原始 SQL。但我不确定如何重新构建我的解决方案。我应该如何处理数据库层?
- 我是否仍然应该为每个模型分配一个类,并使用静态方法来查询对象?或者我应该有一个代表数据库的类?
- 我应该在 ActiveRecord 下编写自己的层(或我自己的类似 ActiveRecord 的实现)以保持现有代码或多或少的健全性吗?
- 我是否应该将 ORM 方法(例如保存/删除)合并到我的模型类中?
- 我应该更改表结构(每个类一个表,包含所有字段)吗?
如有任何建议,我们将不胜感激。我正在尝试找出最佳的架构和设计。
最佳答案
许多人,包括我自己,认为 ActiveRecord 模式是一种反模式,主要是因为它破坏了 SRP 并且不允许 POCO 对象(将您的域与特定 ORM 紧密耦合)。
话虽如此,对于简单的 CRUD 操作,你无法击败 ORM,因此我会为此类工作保留某种 ORM。只需重新架构您的应用程序,以使用 POCO 对象和某种类型或存储库模式以及另一个项目中的 ORM 实现细节。
对于您的“硬”查询,我会考虑使用小型 ORM(例如 Dapper 、 PetaPoco 或 Massive )为每个 View 创建一个类,以使用您自己的原始 sql 查询对象。
关于asp.net-mvc-3 - 抛弃 ActiveRecord 和 NHibernate——如何重新架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12396241/