【发布时间】:2008-10-02 23:48:48
【问题描述】:
Linq to SQL 出了什么问题?
或者 - Linq to SQL 会使其不适用于新项目或现有项目?我想了解您为什么不为特定项目选择 Linq to SQL - 包括哪些项目参数使其不适合。
【问题讨论】:
标签: .net database linq-to-sql
Linq to SQL 出了什么问题?
或者 - Linq to SQL 会使其不适用于新项目或现有项目?我想了解您为什么不为特定项目选择 Linq to SQL - 包括哪些项目参数使其不适合。
【问题讨论】:
标签: .net database linq-to-sql
它不太适应数据库模式的变化。您必须重建 dbml 层并重新生成数据上下文。
与任何 ORM 一样(我不参与关于它是否是 ORM 的争论),您必须知道正在生成什么 SQL,以及这将如何影响您的调用。
插入不是批处理的,因此性能成本可能很高。
它正在被实体框架淘汰
尽管它使用的提供程序模型允许为其他 DBMS 平台构建提供程序,但仅支持 SQL Server。
[编辑 @ AugustLights - 以我的经验:] 延迟加载可能需要一些黑客才能开始工作。
话虽如此,我认为如果使用得当,它会很方便
【讨论】:
对于需要使用 SQL Server 以外的数据库的项目:
1) 你被锁定在使用 SQL Server
对于具有复杂实体关系和/或关系随时间逐渐变化的项目:
2) 您被锁定在表到类的一对一映射中
对于必须使用 .NET 1.x 版本的项目
3) 不适用于 .NET 1.x
【讨论】:
尽管有以上所有,我认为 linq-to-sql 是许多项目的绝佳选择。
【讨论】:
由于System.Data.Linq.DataContext 类上缺少接口,因此在单元测试时很难模拟。这是一种可能的方法:Mocking LINQ to SQL DataContext。
【讨论】:
因为你没有使用 3.5...这是一个有效的答案吗?!?!?
【讨论】:
嗯,我已经使用 LINQ to SQL 开发了一些应用程序。我发现的主要问题之一是必须对您的应用程序进行分层。在 LINQ to SQL 中,实体类与数据访问代码密切相关。此外,DataContext 存在一些问题,这意味着您可以使用 DataContext 对象来检索项目,但不能将项目(对象)转移到另一个 DataContext(至少不容易)。
如果您不关心正确分层应用程序,并且如果您只想快速创建应用程序(也称为快速应用程序开发),LINQ to SQL 将非常有用。
【讨论】:
LINQ-to-SQL 的许多优势来自据称能够在您的代码隐藏中基于来自您的 dbml 的强类型可查询/可枚举数据对象构建数据查询(它扮演着非常重要的角色)有限的 DAL)。因此,正如已经提到的那样,结果是它在一定程度上鼓励您在应用程序中使用严格定义和分离的层或层。
为了反驳这一点,这应该意味着您应该能够消除您写入数据库存储过程中的大部分或全部任何业务逻辑,因此至少您只需转到处理数据的代码即可更改不影响模式的业务规则...但是,当您意识到使用带有分组的聚合的外部联接编写查询是多么复杂时,至少在您第一次接近它时,这会有点崩溃。所以你会很想在你知道的 SQL 中编写存储过程,它是如此简单且擅长做这些事情,而不是花额外的时间试图找出 LINQ 语法来做同样的事情,而它只是要转换它反正丑陋的 SQL 代码...
话虽如此,我真的很喜欢 LINQ,当我开始忽略这种“查询语法更容易阅读”的情绪并转向方法语法时,我对它的尊重大大增加了。从未回头。
【讨论】:
如果您想使用除 SQL Server 之外的其他 RDBMS,我将其标记为技术“搅局者”的唯一情况。 (虽然它可以解决 - 请参阅 Matt Warren 的博客 @http://blogs.msdn.com/mattwar/)
除此之外,您的问题的先前答案中已经列出了一些优点和缺点。但是,到目前为止提到的所有负面因素都有解决方法,因此它们并不是真正的阻碍。
一个非技术性的 [潜在] 阻碍是 MSFT 将放弃它转而支持 EF 的风险...更多信息请点击此处:http://oakleafblog.blogspot.com/2008/05/is-adonet-team-abandoning-linq-to-sql.html
尽管(在我看来,)EF 的当前状态足以让他们继续在 L2S 上工作。所以让我们希望他们这样做......
【讨论】:
真正的 ORM 应该将业务实体的设计与持久性介质分开。这样,您可以分别重构其中任何一个,并且只需要维护两者之间的映射。这减少了您需要为数据库更改维护的应用程序逻辑代码量。
要使用 Linq-to-SQL 完成这种与持久性无关的方法,您必须在 DTO 处使用其生成的类,并维护 DTO 和实体之间的映射逻辑。
有更好的 ORM 可以采用这种方法(如 NHibernate),可以大大减少对 DTO 的需求。
【讨论】:
它doesn't appear to have 对 DB 列上的默认值的任何支持。
【讨论】:
这个问题在over here 之前被问过一次。但是,实质上,LINQ to SQL 会在您的数据库中生成次优执行计划。对于您搜索的每个不同长度的参数,它将强制创建不同的执行计划。这最终会堵塞数据库中用于缓存执行计划的内存,并且您将开始使旧查询过期,当它们再次出现时需要重新编译。
正如我在链接到的问题中提到的,这取决于您要完成什么。如果您愿意以执行速度换取开发速度,LINQ to SQL 可能是一个不错的选择。如果您担心执行速度,还有其他可用的 ORM/DAL/解决方案,它们可能需要更长的时间才能使用,但会为您提供针对架构更改的未来证明和性能更好的解决方案,但代价是额外的开发开销。
【讨论】: