我即将重新开始在.NET 3.5sp1中重写VB6应用程序.VB6应用程序写得很好,数据层完全基于存储过程.我想使用像Linq2SQL/Entity Framework/NHibernate/SubSonic这样自动化的东西.不可否认,除了一次性项目之外,我还没有使用过任何这些工具.
我担心所有这些选择可能带来的潜在问题是速度.例如,现在要检索单行(或整个列表),我使用以下sproc:
ALTER PROCEDURE [dbo].[lst_Customers] @intID INT = NULL ,@chvName VARCHAR(100) = NULL AS SELECT Customer_id, Name FROM dbo.Customer WHERE (@intID IS NULL OR @intID = Customer_id) AND (@chvName IS NULL OR Name like ('%' + @chvName + '%')) ORDER BY name
要在Linq2SQL/Entity Framework/NHibernate/SubSonic中检索单行,这些解决方案是否必须将整个列表下载到客户端并找到我需要的行?
那么,对于具有大型数据域的应用程序,数据访问策略的共识是什么?
我将扮演魔鬼的拥护者并建议你至少考虑坚持使用存储过程.这些代表了一大堆代码,您无需重新编写和调试. 我们的非常自己的这篇文章 Joel Spolsky给出了一个避免完全重写的连贯论点.
给定"绿地"项目,您可以使用您想要的东西,而O/R映射器可能是一个不错的选择.但是,您已经说过VB6应用程序编写得很好.如果sprocs编写得很好,那么你可以免费获得一些应用程序并且它已经调试过,而且你可以回收数据库模式并避免数据迁移带来的大部分痛苦.
Fowler的企业应用程序架构模式应该为您提供一些设计数据访问层的好指针,该层可以很好地与存储过程协同工作而不会导致维护问题.
这在Oracle/Java应用程序上非常常见.许多传统的Oracle应用程序在PL/SQL中都有大量的存储过程代码 - 这是Oracle Forms客户端 - 服务器时代的标准体系结构.通常的做法是在Java中为sprocs编写包装器,并在包装器之上构建用户界面.
其中一张海报提到,Subsonic可以为sprocs生成包装器.
曾几何时,我有机会做一个数据字典hack,为PL/SQL sprocs生成一个概念验证的Java/JDBC包装器--IIRC它只用了一天左右.鉴于它并不难做到,我会惊讶地发现,你可以从现成的东西中做到这一点并没有太多的选择.在紧要关头,写自己的也不是那么难.