Closed. This question is
opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便
editing this post用事实和引用来回答。
7年前关闭。
Improve this question
我面临着很大的从ORM到非ORM的设计难题,并且非常感谢您对下面我的问题的回答和理由,因此,我尝试着尽可能多地纳入相关背景。
背景。
我正在设计一个全新的Web应用程序,并选择将.net(c#)用于服务层和业务对象,并使用MS SQL作为数据库。
我打算建立一个数据驱动的模型,并保持域对象和表合理对齐,以避免过多的O / R阻抗不匹配。原因是我喜欢OO设计(特别是干净,可测试的代码和域逻辑封装),但我真的不喜欢与关系数据库作斗争的想法-以我的经验,在OO vs RDBMS游戏中没有人赢。
这个新项目的开发人员将同时具有.net和SQL的经验-尽管我们中有些人具有很高的知识水平,但没有实际的DBA数字。
所以现在来决定数据访问/持久化方法。
选择
我已经缩小了数据持久性的选择范围:ORM,数据映射器或手写代码。
n冬眠
我以前使用过nHibernate,并将为该项目建议它,因为它节省了所有手动操作,而且我们确实拥有一个由我们控制的全新数据库架构,而不是某些遗留的野兽。
我很高兴接受nHibernate的动态SQL,并准备放弃对数据库的控制并享受好处:快速开发,1/2级缓存,延迟加载,良好的查询支持等,但是有一件事情困扰着我:
会话管理-通过HTTP调用进行的isession的每个请求会话持久性只会让我感到恐惧,并且似乎总是容易出现错误/陈旧的数据。在asp.net会话中推挤一个可能复杂而肮脏的对象图并稍后尝试重新连接似乎很冒险-我记得几年前重新连接会话时在懒加载的集合上出现运行时错误的问题-我记得花了几天的时间了解ORM在做什么-数据持久性的抽象更像是牙齿的抽象!我不明白为什么我必须学习到如此低的水平才能使用它。
MyBatis.Net
我对ORM会话管理感到担心,并且我试图避免数据库与对象之间的巨大不匹配,这让我看了MyBatis.net之类的东西作为替代(我相信myspace使用了它)。
手卷
在以前的项目中,我手工构建了BL / DAL代码-即将属性映射到表字段-对象与存储过程之间的数据封送处理。延迟加载,选择n + 1处理,缓存等。
显然,这需要花费一些时间和大量无聊的重复代码,但是最终您会得到一个熟悉且可以轻松控制的系统:调试变得容易得多。
问题
根据我上面的讨论,
1)我是否应该再给nHibernate一次机会并发誓要爱它并由内而外地学习它
要么
2)我应该学习和使用MyBatis.net之类的东西并利用我的SQL知识吗?
要么
3)手动创建我的映射代码?
或者是其他东西?