是否有可用于我正在构建的应用程序的现有数据层?

Posted

技术标签:

【中文标题】是否有可用于我正在构建的应用程序的现有数据层?【英文标题】:Are there existing data layers I can use for an application I'm building? 【发布时间】:2011-03-16 23:52:29 【问题描述】:

我正在编写一个 .NET 应用程序,从头开始实现数据层的想法对我来说很讨厌。 (通过数据层,我指的是与数据库对话的代码,而不是将数据库访问抽象为域对象的层[有时称为数据访问层并与数据层互换使用]。)

我想找到一个现有的通用数据层实现,它提供标准的 crud 功能、错误处理、连接管理 - 有效。我将只与 SQL Server 交谈。

库是 C# 还是 VB.NET 对我来说并不重要,我不在乎它是 LINQ 还是 ADO.NET。只要它有效。

** 我想强调的是,我不是在寻找数据访问技术或机制(例如 LINQ、ORM 工具等),而是在寻找现有的库。)

【问题讨论】:

【参考方案1】:

如果您只与 SQL Server 对话,Linq to SQL 是您的最佳选择。启动和运行非常容易。您将获得数据层和抽象。您所要做的就是提供一个到 Linq to SQL 的连接字符串,它会处理其余的。

如果您要连接到 SQL 以外的其他数据库,您会希望使用 NHibernate。

NHibernate 比 Linq to SQL 需要更多的工作来启动和运行。 MS 在 Visual Studio 中提供了一个不错的工具,可以让您快速读取 SQL 数据库。

【讨论】:

+1 虽然我会在 nHibernate 旁边包含实体框架。但是,我知道这对很多人来说会引起争议。 嗨大卫 - 我正在寻找已经写好的东西。包括错误处理和其他需要一些努力编码的东西,例如处理各种不同的返回码。我当然不需要库来满足我的所有要求,但我想尽可能地涵盖。【参考方案2】:

你可以使用easyobjects,它的学习曲线非常小,而且非常可扩展。 来自他们的网站:

EasyObjects.NET 是一个强大的 .NET Framework 数据访问架构。当与代码生成结合使用时,您可以在几分钟内从头开始为您的应用程序创建一个完整的数据层。

【讨论】:

【参考方案3】:

我想找到一个现有的通用数据层实现,它提供标准的 crud 功能、错误处理、连接管理 - 有效。我将只与 SQL Server 交谈。

可能想查看Subsonic。虽然我个人觉得它非常有限,但它肯定不是 ORM,而是一个“查询工具”。它将使 CRUD 操作变得简单直接,并为数据库中的每个表生成部分 POCO 类,而不是尝试从数据库映射到域层。

【讨论】:

嗨,qstarin - 我很想有一个预制层。请在 David Basarab 的回答下查看我的评论。谢谢。【参考方案4】:

Microsoft 的Entity Framework 可能是您希望从编写“与数据库对话的代码”中解放出来的东西。

最好的是它已经随 Visual Studio 一起提供,并且 - 根据您的要求 - 您可以使用大多数开箱即用的功能或通过 T4 模板手动将其调整为您的自定义业务逻辑。

您可以将它用于正向和反向工程,并且作为一种微软技术,它可以与 SQL 服务器等其他 MS 产品很好地集成。

我在 3 个月前开始在我当前的工作项目中使用它,该项目由多个窗口和 WCF 服务组成,用于将第三方数据转换为我们自己的数据库方案。根据我们使用它的经验,我们将在未来的项目中更多地使用 EF。

【讨论】:

【参考方案5】:

您希望该框架如何处理您的异常?如果它无法连接到您的数据库,它应该怎么做 - 使应用程序崩溃,显示错误消息(winforms 或 WPF 或 ASP)......问题无穷无尽。

诸如这些答案中其他地方建议的 ORM 可能是您将获得的最接近的。期望第三方框架为您提供所有异常处理是不现实的 - 第三方如何知道您的应用程序的行为方式?

直接回答您要求“提供标准 crud 功能、错误处理、连接管理 - 工作的现有通用数据层实现”的问题很简单:使用 ADO.NET。其他人提供的答案实际上超出了该功能,但您的回答表明您认为还有更远的东西——为您实现数据层的东西。我的建议是,您要查找的内容可能不存在。

【讨论】:

Hi Dan - 随着时间的推移,应用程序开发人员已经实现了无数的数据访问层。必须有现有的。这些确实存在——它们被一次又一次地写下来。使用 ADO.NET 并没有给我预先编写好的功能。它给了我基础技术。它给了我砖块,而不是完整的建筑。不确定您对超出我正在寻找的功能的答案的意思。如果我想要一所房子,而有人给我木头,我就得盖房子。除非我没有明确我的要求?会喜欢你的想法。谢谢。 您究竟在寻找哪些预先编写的功能,比如 Linq-to-SQL 或 NHibernate 不提供? Linq to SQL 和 NHibernate 是 ORM - 它们为您提供映射系统。您仍然需要创建 CRUD 函数,仍然需要实现异常处理,仍然需要处理特定于数据库的返回码。显然,任何现有的数据访问库都需要了解底层架构,但 crud 操作本质上是相同的。回到我关于数据库响应代码处理的观点——这可以作为一个公共基类来实现,这样所有的 crud 操作都会受益。使用 ORM 并不能自动解决这个问题。 你说“你希望这个框架对你的异常做什么?如果它无法连接到你的数据库,它应该怎么做 - 使应用程序崩溃,显示错误消息(winforms 或 WPF或 ASP)……问题无穷无尽。”我不是在寻找它来决定做什么 - 显然这是特定于应用程序的。我正在查找有关导致特定异常的原因的信息(例如锁定问题等),我将酌情处理。可能会发生很多数据库条件。如果我可以使用一个已经意识到这一点的库,它会让我的工作更轻松。 那么您会寻找哪些信息是您无法从标准SqlConnection 异常中获得的?正如您使用基本 ADO.NET 描述的那样,您会得到错误原因。您还说“CRUD 操作在 [系统之间] 本质上是相同的”,但显然不是:除了 SELECT 关键字之外,不同模式的查询之间几乎没有共同点!您无法比 ADO.NET 或类似的方法更抽象这些查询 - 也就是说,使用 DataSet/DataAdapter 之类的类根据架构自动为您构建语句。【参考方案6】:

老实说,我一直是 NHibernate 的粉丝。随着最新版本的Enterprise Library 5 Data Access Block,他们在本地添加了动态映射支持。我必须强烈考虑不要在项目中使用 NHibernate,而是使用我的域对象中的前向数据库生成工具来创建我的数据库(甚至可能仅使用 NHibernate 来导出方案)或类似 CodeSmith 的东西并使用 EntLib。

【讨论】:

嗨,克里斯 - 喜欢这个答案。我忘记了这件事。你知道它是否包括错误处理吗?不仅是异常处理,还有 SQL Server 特定错误代码的处理。 据我所知,这些只会冒泡为标准 sql 异常。

以上是关于是否有可用于我正在构建的应用程序的现有数据层?的主要内容,如果未能解决你的问题,请参考以下文章

覆盖/强制推送 gemfury 中的现有软件包版本

是否有可用于 phing 的 ssh 和 scp 任务?

是否有可用于跟踪用户活动的框架?

Web 应用程序:用于数据层的 DAO 和 JPA

提高 nHibernate 数据访问层的性能

Java SFTP 服务器库? [关闭]