如果您可以使用任何.NET DAL技术,您会选择什么?

时间:2009-01-23 10:09:40

标签: .net linq data-access-layer

几年后我又回到了.NET开发阶段,现在看来,特别是对于LINQ,您访问数据的方式已经改变并变得更加容易。例如,在ASP.NET MVC网站中,我可以:

  • 添加项目
  • 添加LINQ-to-SQL类
  • 将数据库表拖到LINQ-to-SQL对象关系设计器上,单击“保存”
  • 通过LINQ one-liners访问和操作我的数据 (我在这里学到了:http://www.asp.net/learn/mvc/tutorial-11-cs.aspx

这看起来很棒,但它是如何真实世界的呢?

  • 是您在实际项目中使用的上述LINQ-to-SQL场景,或者它只是一种快速的脚手架技术,即当您开始添加,删除数据库中的字段和表时会发生什么,LINQ如何-SQL类保持同步?

我如何理解这个领域的所有新技术,例如

  • Subsonic适合哪里?
  • Astoria(ADO.NET数据服务)在哪里适用?
  • NHibernate适合哪里?
  • 如何使用LINQ-to-SQL的其他数据库(我尝试在对象关系设计器上拖动SQLite表并获得“不支持的错误”)或者仅针对SQL Server使用LINQ-to-SQL?
  • LINQ-to-XML的工作方式与LINQ-to-SQL类似,例如:我可以将XML文件拖入设计器,然后使用LINQ访问它们,还是需要为此编写自己的代码?
  • LINQ-to-Entities的工作方式是LINQ-to-SQL,即自动生成的类,但只有更多的选项?

  • 是ADO.NET,其DataTables和DataSets是一项旧技术,现在我们有LINQ吗? LINQ-to-ADO.NET有意义吗?

  • Azure适合您甚至不再拥有RDBMS的地方

  • 当你的用户界面只是简单地与WCF交谈或与网络服务交谈时,ESB适合哪里?

现在我们有很多选择,如果您可以为项目选择任何这些技术,您会选择哪个以及为什么?

4 个答案:

答案 0 :(得分:4)

初步回复(主要是关于LINQ的东西):

  • LINQ to SQL是您可以在实际项目中使用的东西;我已经做好了。当您右键单击设计图面并选择“查看代码”时,我们倾向于将所有数据访问代码放在部分类中,而不是在整个代码中分散为单行。
  • 使用LINQ to SQL如果修改数据库,则需要删除并重新添加表 - 这是一个限制,使用实体框架,您可以“从数据库更新模型”以自动添加/删除这些列。
  • 它应该被称为LINQ to MSSQL Server - 它直接绑定到SQL Server。如果你想对其他数据源使用类似的工具,你可以查看实体框架 - 但是这目前还有其他的局限性 - LINQ to SQL和任何可以工作的概念证明一样多。
  • ADO.NET Data Services为您提供了一个基于REST的ADO.NET对象接口 - 因此您可以调用简单的Web服务来检索数据,而无需编写这些服务。
  • 不,LINQ to XML没有设计界面 - 我想有人可以用XSD做点什么,这很有意思;)
  • 您可以将Azure视为“云中的操作系统”,它有一个存储数据库,尽管如您所述,它不是关系型的,没有连接,但您仍然会查询结果

要回答你的最后一个问题,我对NHibernate或其他人没有足够的了解,但我很乐意使用LINQ to SQL进行基本的数据库访问,但我已经开始关注LINQ to Entities了解我的问题。更复杂的东西而不是其他东西 - 主要是因为我喜欢漂亮的图片。

答案 1 :(得分:1)

我刚刚为我们正在开始的新项目回答了同样的问题,并且在我们决定LLBLGen后我们决定的替代方案之后,因为:

  • 它比实体框架更成熟
  • 它支持Linq查询
  • 由几位专门的开发人员积极开发
  • 价格便宜
  • 支持很棒

PS。我应该提一下,我是llblgen和/或解决方案设计的

答案 2 :(得分:1)

关于 SQLite :我已成功使用dbLinq为SQLite数据库构建LINQ查询。它还处于初期阶段,因此期望必须在生成的类中修复一些内容,但它可以满足我的需求。我猜测LinqToSql会做的所有事情的85%。项目中有大量的单元测试来告诉你他们知道失败的原因。

dbLinq支持许多其他数据库(MySQL,PostgreSQL,Firebird)。我没有将它用于除SQLite之外的任何东西。

答案 3 :(得分:0)

我也使用linq2sql,效果很好。 一旦你意识到生成的类是局部的,你可以把自定义代码,字段,等等。 我几乎从生成的linq2sql类中创建了我的业务类。

一个警告:varchar(1)默认转换为char。这给了我麻烦,因为varchar(1)可以是“”而char不能......在属性窗口中简单切换到字符串就解决了这个问题。