C# 什么';为ASP.NET MVC项目设置数据访问的最佳方法是什么?

C# 什么';为ASP.NET MVC项目设置数据访问的最佳方法是什么?,c#,asp.net,asp.net-mvc,visual-studio,visual-studio-2008,C#,Asp.net,Asp.net Mvc,Visual Studio,Visual Studio 2008,我正在开始学习一个新的ASP.NET MVC项目,我想知道设置项目以连接到SQL server以获取数据的最佳方式是什么。例如,假设我们有一个产品表和一个产品对象,我想用它来填充视图中的数据 我知道在这里的某个地方,我应该有一个可以实现的接口,等等,但我今天不能把我的想法放在它上面:-( 编辑:现在(即:这个应用程序的当前编码糟糕的版本)我只是使用普通的旧SQL server(甚至2000),只使用存储过程进行数据访问,但我不反对为使用linq to SQL或其他东西添加额外的灵活性层 编辑#2

我正在开始学习一个新的ASP.NET MVC项目,我想知道设置项目以连接到SQL server以获取数据的最佳方式是什么。例如,假设我们有一个产品表和一个产品对象,我想用它来填充视图中的数据

我知道在这里的某个地方,我应该有一个可以实现的接口,等等,但我今天不能把我的想法放在它上面:-(

编辑:现在(即:这个应用程序的当前编码糟糕的版本)我只是使用普通的旧SQL server(甚至2000),只使用存储过程进行数据访问,但我不反对为使用linq to SQL或其他东西添加额外的灵活性层


编辑#2:我想补充的一点是:我将针对数据库的V1编写这篇文章,我需要能够让我们的DBA重新处理数据库,并在以后给我一个V2,因此最好只需要更改一些现在数据库中没有提供的小东西,而不必重新编写编写一个全新的DAL。

在我网站的解决方案中,我有一个MVC web应用程序项目和一个“通用”项目,其中包含我的POCO(普通的C对象)、业务经理和数据访问层


DAL类绑定到SQL Server(我没有将它们抽象出来),并将POCO返回给业务经理,我在MVC项目中从控制器调用这些POCO。

这实际上取决于您使用的是哪种数据访问技术。如果您使用Linq to SQL,您可能希望将数据访问抽象到某种“存储库”后面接口,例如IPProductRepository。它的主要吸引力在于您可以随时更改特定的数据访问实现(例如在编写单元测试时)

我试着介绍一下:

我想看看他创建MVC店面的视频。这个系列可以在这里找到:


本系列深入探讨了各种与设计相关的主题,以及与MVC和其他项目一起使用的编码/测试实践。

对于我们的应用程序,我计划使用LINQ to Entities,但由于它对我来说是新的,如果它不能像我所希望的那样执行,我可能希望在将来替换它,并使用其他工具ike LINQ转换为SQL或NHibernate,因此我将把数据访问对象抽象到一个抽象工厂中,以便对应用程序隐藏实现


如何做到这一点取决于您自己,只要您选择一种经过验证且众所周知的设计模式进行实施,我认为您的最终产品将得到很好的支持和健壮性。

请查看一个很好的参考应用程序,该应用程序可以做到这一点,正如@haacked所说的那样,可以将它们分开。

我认为Billy McCafferty是一个很好的例子,它将ASP.NET MVC与数据访问层(默认使用NHibernate)、依赖注入(Ninject atm,但有计划支持CommonServiceLocator)结合使用该框架仍在开发中,但我认为它是相当好和稳定的。对于当前版本,应该有很少的更改,直到有一个最终版本,所以对它的编码应该是好的。< /P> < P>使用LINQ。创建一个LINQ到SQL文件,拖放所有需要的表和视图。你叫你的模型所有你的CRUD级别的东西都是为你自动创建的

LINQ是我很久以来见过的最好的东西。这里有一些简单的示例,可以从Scott Gu的博客中获取数据


我刚刚完成了我的第一个MVC项目,我使用了一个服务存储库设计模式。现在网络上有很多关于它的信息。它使我从Linq->Sql轻松过渡到实体框架。如果你认为你将要做很多改变,那就在使用接口方面投入一些额外的精力


我为您的DAL/存储库推荐实体框架。

我已经完成了一些MVC应用程序,并且我发现了一个非常适合我的结构。它基于JPrescottSanders提到的(尽管他发布的链接是错误的)

因此,我通常尝试将控制器限制为仅包含视图逻辑。这包括检索要传递到视图的数据,以及从视图传递回域模型的数据映射。关键是尝试将业务逻辑排除在这一层之外

为此,我的应用程序通常有3层。第一层是表示层-控制器。第二层是服务层-该层负责执行复杂的查询以及验证等操作。第三层是存储库层-该层负责对数据库的所有访问

因此,在您的产品示例中,这意味着您将拥有一个ProductRepository,其中包含GetProducts()和SaveProduct(产品产品)等方法。您还将拥有一个ProductService(取决于ProductRepository),其中包含GetProductsForUser(用户用户)、GetProductsWithCategory(类别类别类别)和SaveProduct等方法(产品)。验证之类的事情也会在这里发生。最后,您的控制器将依赖于您的服务层来检索和存储产品


你可以跳过服务层,但你通常会发现你的控制器非常胖,而且往往做得太多。我已经尝试过很多次了,而且它的工作效果非常好,特别是因为它非常好地支持TDD和自动测试。

我想你需要一个orm

例如实体框架(代码优先)

您可以为模型创建一些类

将这些模型用于逻辑和视图,并将它们映射到db(v1)

当dba给您新的db(v2)时,只需更改映射配置。(v1和v2都是rdb、sql server、mysql、oracel…),如果db(v1)是rdb,db(v2)是nos