9

我一直在研究为我正在设计的新的基于 Web 的项目使用什么数据层,并且我非常热衷于将 LINQ 与 SQL 结合起来。它明显的简单性、灵活性和设计器支持确实很有吸引力,并且与 SQL Server 的隐式连接很好。

然而,最近宣布 LINQ to SQL 将退居到实体框架之后,因为它已被传递给 ADO.NET 团队 ( http://blogs.msdn.com/adonet/archive/2008/10 /29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx)。当然,它会在未来得到支持,但不太可能看到更多的开发工作。

考虑到这一点,您会推荐我在我的项目中使用这项技术,还是值得选择替代 ORM(nHibernate?)或手动编写通用 DAL?

该项目本身是基于 ASP.NET 和 SQL Server 2005/2008 的,并且可能会使用 MVC,即使它仍处于测试阶段。这是一个个人项目,数据库不会过于复杂,主要用作看.NET未来技术的原型。不过,我会将未来的项目建立在我从这个项目中学到的东西上,所以我做出的选择会影响到更大的解决方案。

是的,我意识到微软明天可能会推出全新的数据访问技术!;)

4

11 回答 11

7

选择 NHibernate。它将作为一个概念或实际的 ORM 存在一段时间。因此,学习两者都会很有用。

于 2008-12-24T14:16:56.580 回答
4

IMO,这整件事真的被夸大了。

微软并没有说 LINQ to SQL 会死。他们更多地表示它将被合并到实体框架中。

我会专注于使用实体框架作为解决方案,因为我知道大部分 LINQ to SQL 都将包含在其中。

反正现在真的没有太大区别。最大的抱怨是实体框架不是轻量级的。只要您的层级之间有良好的分离,这真的很重要吗?

于 2008-12-24T15:00:16.833 回答
4

好吧,这里的答案主要涵盖了它(也有一些有趣的观点),但无论如何我还是要再说一遍。

LINQ to SQL (L2S) 非常通用,但从我的角度来看,它感觉有点太基础了。在大多数情况下,它在做简单的事情方面做得很好,但只要你要求更多一点,它就会变得昂贵。这根本不是一件坏事。我实际上认为 LINQ to SQL 实际上很好地补充了实体框架。

以使用 LinqDataSource 的自动分页为例。如果您不指定 Order By/Group By 那么它是非常经济的。将排序或分组放入组合中,您开始获得性能飙升(变得非常健谈)。然后,您几乎必须编写自己的分页实现(我承认这并不难)。

我将是第一个承认 L2S 在生成的 T-SQL 的质量方面优于实体框架的人(我应该,因为 L2S 是专门为查询 SQL Server 而构建的)以及在概念和语义上,大部分 LINQ to SQL 与 EF 类似,但您遇到的问题是扩展需求和考虑更复杂的实现要求。

如果我要从头开始并选择投入个人开发时间,我会选择实体框架。有趣的是,我目前正在开发一个使用 L2S 的项目,它旨在扩展和处理重负载,但是当我们遇到一些更具“创造性”的要求时,我们经常被迫扩展 SQL Metal (例如多对多关系)。

所以..简而言之..我会这样处理:

a) 学习 LINQ to SQL 作为介绍(微软的 ORM 模式和技术)。它让您熟悉与实体框架共享的大部分基础知识,并体验 LINQ 样式查询(如果您有后天的体验) T-SQL 的背景)

b)一旦您掌握了 LINQ to SQL,我建议您跳到实体框架以了解其他好处(eSQL 等)

c) 在两者中实施概念验证项目并比较结果。

于 2009-01-06T07:01:01.340 回答
2

L2S 是,恕我直言,它的方式非常好,正如你所说,不会去任何地方。我工作的公司已将它作为我们的数据访问标准,我们将它用于从 5 个用户小众应用程序到 1000 多个用户企业应用程序的所有应用,并取得了很好的效果。

于 2008-12-24T14:25:47.810 回答
2

查看亚音速:

http://subsonicproject.com/

于 2008-12-24T14:28:36.260 回答
2

我认为EDM的目标比 LINQ to SQL 的目标要大得多。如果您正在寻找一个简单的 ORM,那么我认为 LINQ to SQL 是要走的路。如果您计划构建具有与具有关系结构的数据库表相关的继承结构并执行其他高级映射的类,那么 EDM 可能是一个不错的选择。

于 2008-12-24T14:30:35.897 回答
2

值得一提的是,该站点是使用 LINQ to SQL 构建的。Jeff 在 StackOverflow 播客中谈到了使用它。

于 2008-12-24T15:38:59.457 回答
2

L2S 是一项很棒的技术,我永远不会回到旧的 ADO。

但正如你所提到的,它正在让位给 L2E。L2S 功能强大,我已经使用它进行了许多应用,并且非常高兴。但是听说它不再先进了,就在我身边放了一把刀。所以我去检查了 L2E,它在 SQL 交互方面几乎是一样的,而且在很多方面我发现它更容易,更不用说它的关系处理更有效了。有了这样的相似之处,选择 L2E 似乎是合乎逻辑的。

我写了一篇关于进行切换和比较两个框架的帖子:http: //naspinski.net/post/Getting-started-with-Linq-To-Entities.aspx

我几乎可以保证你会对这些框架中的任何一个感到满意,它们是开发的天赐之物。简单性和避免错误是首屈一指的。我个人倾向于 L2E,因为它将比 L2S 更积极地开发。

于 2009-01-06T06:40:29.697 回答
2

我在当前的 Web 项目中大量使用 L2S,我相信您会发现最大的问题是有关进行 n 层数据库开发的最佳方法的文档相互矛盾。

首先,您需要预先意识到的是,DataContext 对象的持续时间仅与工作单元、周期一样长。此外,DataContext 是无状态的。一旦你掌握了这两个原则,在 n 层环境中使用 LINQ 就可以很好地工作了。

另一方面,你会看到很多人推荐一些非常非常非常糟糕的方式来使用 Linq。永远不要让你的 DataContext 静态,这是我早期犯的一个错误,它创造了奇迹,直到它不起作用,然后在不同的会话中交叉错误的数据等,这绝对是可怕的。简单地说,这可能是最大的使用 Linq 的最大禁忌,应该在每个文档中用粗体大写字母书写。此外,在 Session 变量中持久保存 DataContext 也是一个坏主意。

我在使用 LINQ 时遇到的唯一另一个主要问题是在进行断开连接的更新时,您需要在整个调用中使用相同的 DataContext。例如:

    public static void UpdateUser(UserLibrary.User user) {
        using (UserLibraryDataContext dc = new UserLibraryDataContext(_conStr))
        {
            UserLibrary.User newUser = (from user2 in dc.Users where user2.UserID == user.UserID select user2).FirstOrDefault();
            newUser.Email = user.Email;
            newUser.FirstName = user.FirstName;
            newUser.LastName = user.LastName;
            dc.SubmitChanges();
        }        

您不能简单地传入在不同数据上下文中创建的用户并期望更新工作,除非您设置 DataContext.ObjectTrackingEnabled = false,我不建议这样做。相反,在同一个 DataContext 中,您应该检索现有对象,更新其值,然后提交更改。将所有类似的任务保存在同一个 DataContext 中。

不过我会推荐 L2S,一旦你解决了一些琐碎的问题(比如上面的问题),它就是一项很棒的技术,而且绝对可以节省时间。但是,我建议在您的 DAL 周围做一个薄包装,这样您就可以轻松更改。我正在考虑(出于经济原因)将我的部分代码移植到使用 OpenAccess ORM -> MySql 进行部分数据访问,并且使用正确定义的层,这项任务应该只需要我几个小时。

于 2009-05-05T18:30:28.897 回答
1

我同意回声风暴。L2S 非常适合您的需求。而且它很容易使用......

于 2008-12-24T15:01:15.443 回答
1

如果您正确设计您的应用程序并很好地隔离您的数据访问层,那么您应该使用 L2S。根据我从您的帖子中推断,这不是一个大项目,因此 L2S 应该可以很好地满足您的要求,而普通的旧 ADO.NET 只是一个禁忌,而 Entity Framework 是......只是不要使用它, 行?无论如何,如果你很好地隔离了你的 DAL,如果项目增长,你可以在未来将 L2S 换成其他东西。即使 L2S 不会去任何地方,它也不会去任何地方。MS 停止了对它的投资,但它不会被弃用或其他东西,所以它仍然是一项安全的投资。或者,您应该评估简单而成熟的 NHibernate。

于 2009-01-06T06:51:17.020 回答