我公司的政策强制只使用存储过程(SP)与DB通信
(没有动态执行SELECT,应用程序端的VIEWS可用)
业务对象(BO)从DB中获取
使用SQL Reader实现了简单的BO-DB映射器,这看起来效果很好。
表单数据库端我们为每个业务对象提供一个参数化SP,一个SP用于所有CRUD操作,由@MODE参数切换) 所以我们没有像SP_INSERT,SP_UPDATE,SP_SELECT等单独的SP ......
我最近读过很多关于linq2SQL,nHibernate,Subsonic等的内容,看起来非常有趣 我注意到主要的ORM的好处是直接从c#代码执行/过滤的灵活查询 - 在我的话中我不能执行这样的(只允许SP ...)
所以,我想知道
- 如果在我的环境中使用ORM值得吗?
- 你能提到任何好处吗?
- 如果是的话 - 你可以推荐什么ORM
您的看法是什么?
答案 0 :(得分:6)
恕我直言,可能不是。 ORM专注于对象模型,并基本上尝试将数据库视为哑存储或数据。您的存储过程中可能包含业务逻辑,这与一般原则(或至少约定)有些相反。f值得在我的ORM中使用ORM 环境?
至少,您可能会将对象手动映射到存储过程和从存储过程进行映射。
答案 1 :(得分:3)
有人问similar question some time ago - 关于使用ORM来包装遗留存储过程的主体。如果您有这种类型的现有代码库或对架构的政治限制,您可能希望查看其他数据访问机制,看看它们是否会更好地工作。 Fowler的Patterns of Enterprise Application Architecture在为此编制各种选项方面做得很好。
另一种方法是通过政治渠道查看是否可以放宽约束'在ORM无法正常工作的极端情况下使用存储过程,否则使用ORM'。
答案 2 :(得分:2)
我想知道这个“建筑”决定背后的理由是什么。
手动处理低级别的ADO.NET(是的,IDataReader 是低级别)几乎不是一个好主意。
NHibernate允许您指定用于查询和修改数据的自定义SQL,但是这样做会损失NHibernate提供的大量功能。
相反,请考虑使用一个简单的结果集映射器,例如BLToolkit,它可以在处理sprocs时解除大部分繁琐的工作。
答案 3 :(得分:2)
我很高兴我不在你工作的地方工作。我接受了非常痛苦的教育,为什么应该避免存储过程,除非它们不久前对于性能或数据完整性原因至关重要。我接受了一个遗留项目。程序源的一半是在Java版本控制下。其中一半作为存储过程嵌入数据库中。您几乎必须拥有DBA权限才能看到它,远程处理它是不可能的。它还与Microsoft SQL Server驱动程序的事务管理器打架。
但话说回来,我曾与之合作的ORM经理对存储过程没有任何问题,只有我。
主要的是,使用ORM的主要原因是为了更容易在卫星服务器上的应用程序中执行“存储过程”,而不是将所有工作转储到数据库服务器上。当然,当所有源代码都在一个地方并使用一种语言时,它也很有用。
答案 4 :(得分:1)
一些(可能全部,我并不完全熟悉所有这些)ORM工具为您提供了一个类来调用您的存储过程。这有助于智能感知,类型,名称等。
SubSonic有这个,我觉得能够调用Project.DAL.SPs.InsertEmployee('John','Doe')而不是构建参数列表非常有帮助。
答案 5 :(得分:1)
不完全是ORM工具,但您可以使用其他一些数据访问工具,这样您就可以轻松调用这些存储过程并特别实现其结果。这是这些工具将为您提供极大帮助的地方。想想使用SP所需要做的所有事情:
所有这些都是非常重复的工作,你可以很容易地避免。
我赞成存储过程而非ORM,因为一旦你开始编写一些访问多个表并以任何方式加入它们的更复杂的查询,你就会陷入一大堆麻烦和头痛。与在ORM中必须执行的优化和变通方法相比,复杂的存储过程通常花费更少的时间来编写它(或者至少在某种程度上与实际的存储过程调用相当)。要真正优化某些调用,您必须彻底了解ORM工具。相信我,我一直在使用实体框架(包括非常简化的EF扩展库)。
反正。我建议你看一下 BLToolkit ,这是一个DAL工具而不是实际的ORM工具。我用它来调用我的存储过程并轻松实现其结果。
这个工具实际上使您可以非常简单地透明地使用存储过程。如果您use T4 template我也写过,您可以轻松地避免代码中的魔术字符串(存储过程的名称和参数名称)。模板自动导入存储过程,并使用采用强类型参数的方法创建类(与SP参数的C#等效的C#)。
由于您在单个SP中拥有所有CRUD操作,因此您的SP有点奇怪。如果您愿意,可以更改我的T4模板以为每个SP @Mode调用创建所有四种方法。这会让你感觉很好:
User newUser = db.User.Create(...);
User existingUser = db.User.Get(...);
db.User.Delete(...);
User updatedUser = db.User.Change(...);
如果您不知道我在说什么,您可以查看我的链接博客文章,在那里我解释问题并用T4解决它。
答案 6 :(得分:0)
这种性质的所有主题的正确答案是,“它取决于”。有些事情需要考虑: