Linq to SQL有什么问题?
Linq to SQL有什么问题?
还是Linq to SQL会使它不适用于新的或者现有的项目?我想听听我们为什么不为特定项目选择Linq to SQL,包括哪些项目参数使其不合适。
解决方案
好吧,我已经开发了一些使用LINQ to SQL的应用程序。我发现的主要问题之一是必须对应用程序进行分层。在LINQ to SQL中,实体类与数据访问代码紧密相关。另外,DataContext存在一些问题,这意味着我们可以使用DataContext对象检索项目,但不能(至少不容易)将项目(对象)转移到另一个DataContext。
如果我们不关心应用程序的正确分层,并且只想以快速的方式创建应用程序(也称为RAPID应用程序开发),则LINQ to SQL将非常有用。
它不太适应数据库模式中的更改。我们必须重建dbml层并重新生成数据上下文。
像任何ORM一样(关于它是否是ORM,我不会进行辩论),我们必须知道正在生成什么SQL,以及它将如何影响调用。
插入件不分批处理,因此会带来较高的性能成本。
支持实体框架已被淘汰
尽管事实上它使用的提供程序模型将允许为其他DBMS平台构建提供程序,但仅支持SQL Server。
[根据我的经验,编辑@ AugustLights:]延迟加载可能需要一些破解才能开始工作。
话虽这么说,我认为如果使用正确就非常方便
LINQ-to-SQL的许多优势来自据称能够基于dbml中强类型的可查询/可枚举的数据对象,在代码后方构造数据查询(其作用是非常有限的DAL) 。因此,正如已经提到的,结果是它鼓励我们在应用程序的外部使用严格定义和分离的层或者层。
为了解决这一问题,这意味着我们应该能够消除要写入数据库存储过程中的大多数或者所有业务逻辑,因此至少我们只需要转到处理数据的代码即可。更改不影响架构的业务规则...但是,当我们意识到使用带有分组聚合的外部联接编写查询的复杂性时,至少在我们初次使用它时,这种做法会有所突破。因此,我们会很想在SQL中编写存储过程,因为我们知道这样做非常简单并且擅长于执行这些操作,而不是花费额外的时间试图弄清楚LINQ语法在将其转换时是否可以执行相同的操作反正丑陋的SQL代码...
话虽如此,我确实很喜欢LINQ,当我开始忽略这种"查询语法更易于阅读"的感觉时,我对LINQ的评价大大提高了。永不回头。
在单元测试中很难模拟,因为在System.Data.Linq.DataContext类上缺少接口。这是一种可能的方法:将LINQ模拟到SQL DataContext。
因为我们未使用3.5 ...这是一个有效的答案吗?!?!?
对于需要使用SQL Server以外的数据库的项目:
1)我们已锁定使用SQL Server
对于具有复杂实体关系和/或者随时间而逐渐变化的关系的项目:
2)我们已锁定表到类的1对1映射
对于必须使用.NET 1.x版本的项目
3)不适用于.NET 1.x
在此之前,曾有人问过这个问题。但是,从本质上讲,LINQ to SQL在数据库中生成次优的执行计划。对于要搜索的每个参数的不同长度,它将强制创建不同的执行计划。这最终将阻塞数据库中用于缓存执行计划的内存,并且我们将开始使较旧的查询过期,当它们再次出现时,将需要重新编译它们。
正如我在所链接的问题中提到的那样,这与我们要完成的工作有关。如果我们愿意用执行速度换取开发速度,则LINQ to SQL可能是一个不错的选择。如果我们担心执行速度,可以使用其他可能需要花费更长时间的ORM / DAL /解决方案,但将来会为我们提供针对架构更改的证明,并为我们提供性能更高的解决方案,但会增加开发开销。
- 无法在数据上下文上混合n匹配的延迟加载/渴望加载。
- 真正的持久性无知非常困难。
- 映射选项是有限的。例如,不存在多对多关系。
- 将映射与架构更改重新同步是很痛苦的。
尽管有上述所有内容,但我认为linq-to-sql是许多项目的绝佳选择。
我唯一要标记为技术" showstopper"的东西是,如果要使用SQL Server以外的其他RDBMS。 (尽管可以解决该问题,请参阅Matt Warren的博客@ http://blogs.msdn.com/mattwar/)
除此之外,在我们对问题的先前回答中已经列出了一些利弊。但是,到目前为止提到的所有负面因素都有解决方法,因此它们并不是真正的热门。
非技术性的[潜在的]失败者是MSFT放弃它而支持EF的风险。 linq-to-sql.html
尽管(我认为)EF的当前状态足以使他们继续进行L2S研究。所以我们希望他们能...
它似乎不支持DB列上的默认值。
真正的ORM应该将业务实体的设计与持久性介质分开。这样,我们可以分别重构其中任何一个,而只需维护两者之间的映射。这减少了为数据库更改而需要维护的应用程序逻辑代码的数量。
要使用Linq-to-SQL实现这种持久性不可知论方法,我们将不得不在DTO处使用其生成的类,并维护DTO与实体之间的映射逻辑。
有很多更好的ORM(例如NHibernate)采用这种方法,可以大大减少对DTO的需求。