要明确的是,我并没有要求进行并列比较,这已经被问到了Ad Nauseum。我也不是在问Linq2Sql是不是死了,因为我不在乎。我要问的是这个....
我正在为非营利组织构建内部应用程序。我是员工中唯一的开发人员。我们总是使用SQL Server作为我们的数据库后端。我也设计和构建了数据库。我已经成功使用过两次L2S。
考虑到所有这些因素,有人能为我提供使用EF代替L2S的令人信服的理由吗?
本周末我参加了 Code Camp ,经过长达一小时的EF演示,我可以在L2S中完成所有这些,我问了同样的问题。发言者的回答是,“L2S已经死了......”很好!不! (see here)
我理解EF是我们将来要使用的MS(see here),它提供了更多的自定义选项。我无法弄清楚的是,在这种环境中,如果有任何应该或对我来说是重要的。
我们在这里遇到的一个特殊问题是我继承了基于4个不同SQL数据库构建的核心应用程序。 L2S在这方面遇到了很大的困难,但当我问上述发言人时,EF是否会在这方面帮助我,他说“不!”
答案 0 :(得分:8)
使用EF,您可以在类对象和数据库表之间获得映射层(即您的实体)。如果您需要这种灵活性,或者更喜欢domain-driven design模型(而不是表驱动设计),EF可能值得考虑。 Linq to SQL几乎是一个从表到表的映射器。
答案 1 :(得分:7)
我很大的理由不使用Linq2SQL是因为它有一个重大的implcit设计缺陷:
使用DataContext的建议最佳做法是将其用于短暂的“工作单元”样式。很棒,除了它是一个中等昂贵的对象,一直在创建和处置。
当您想要反序列化或重新创建对象(可能来自提交的网页)然后更新现有记录时,会出现这种障碍。 Linq-to-sql提供的Attach方法只接受以下三种情况:
第一种情况需要数据库更改,这对某些环境来说是不可接受的。 第二种情况是右下方效率低下 - 为什么要检索已有的数据? 第三种情况是不现实的 - 无状态网络应用程序通常不会保留历史信息。
这里的要点是...... EF4.0允许您将对象重新附加到ObjectContext并将其标记为已添加或新,并且上下文将相应地生成正确的INSERT / UPDATE语句。
答案 2 :(得分:4)
我自己常常想到这一点,因为EF似乎比L2S增加了很多复杂性。由于MS正在积极开发EF,因此EF 4的一些新方面可能值得一试。有一个nice summary on the ADO.NET team blog描述了EF的API如何发展以支持更广泛的开发模式。
特别是,我个人对POCO和存储库模式的支持感兴趣,因为它们非常适合我工作的项目。在我看来,使用任何特定提供商的一个令人信服的理由是,将来切换到完全不同的提供商是多么容易(当然,不需要检索所有应用程序代码)。我发现L2S在这方面缺乏(开箱即用,反正),我很高兴看到EF 4的变化。但是,到目前为止,我只是在阅读EF 4中的这些变化,所以我可以'说他们在实践中的实际运作情况。
答案 3 :(得分:3)
EF适用于全面的ORM,其对象模型与数据库模式明显不同。 L2S更多的目标是成为一个快速的DAL生成器。
问题在于EF是一个平庸的ORM,而L2S是一个非常棒的DAL生成器。
我想说如果L2S符合您的需求,请坚持下去,不要让MS营销推动您。如果L2S没有做你需要它做的事情,你需要留在微软产品中,与EF一起使用。如果您对自己的技术有一点自由,请查看NHibernate和LLBGen(即使两者都比EF更好)
答案 4 :(得分:2)
他们都非常错。自从我一个月前开始使用它以来,我在实体框架中找到8 bugs(两个影响L2S,至少有三个仍然存在于EF4中)。这是我一生中最痛苦的经历之一。
如果EF按照他们想要的方式工作,那么类和表的分离将非常好。
答案 5 :(得分:1)
当我第一次看到EF并且我已经在Linq2Sql中编写了一个大型应用程序时,我问自己这个问题。最大的变化是在对象映射层完成的。在EF关系中,为您管理导航。因此,如果我有两个具有外键关系的表(比如宠物和所有者)我可以做
pet.owner
而在L2S中,我必须自己编写连接查询。如果你有一个'纯连接表'(这是一个包含两个外键而没有其他数据的表),则可以很好地处理多对多映射,那么该表不会在对象映射中表示。
您也可以自己处理急切/延迟加载。
我也可以在POCO中开发,所以我不直接与框架绑定,即我没有L2S或EF类型的所有噪音妨碍,这使得测试更容易。
总的来说,我更喜欢EF但YMMV
答案 6 :(得分:0)
嗯,最后取决于必要条件。
现在你使用linqtosql并且它适合你,但也许有一天你有更复杂的要求,你可以用EF更好地完成。例如使用速度或其他。
答案 7 :(得分:0)
如果您希望应用程序在其他DBMS上扩展,那么实体框架具有更好的兼容性,这是其中一个主要优势。
实体框架将在除Microsoft SQL Server之外的DBMS上运行,如Oracle,MySQL等。
虽然Linq仅限于MS SQL Server。
答案 8 :(得分:0)
L2S允许隐式延迟加载,而EF具有显式延迟加载。在一个小项目中,在L2S中完成的隐含工作当然是很好的,有利于快速开发和对模型的更改,但在较大的项目中,开发人员可能希望更多地控制应用程序调用的数据库资源。
请参阅http://www.singingeels.com/Articles/Entity_Framework_and_Lazy_Loading.aspx
答案 9 :(得分:0)
前段时间我为所有项目切换了Linq2Sql到Entity Framework。最初它在几个方面是一个倒退 - 在Linq2Sql中工作正常的日期表达式在EF中不起作用并且没有延迟加载选项。但现在,使用Entity Framework 4,一切顺利。
如果只是你而你没有时间学习EF,请坚持使用Linq2Sql。但是如果你确实有时间并且认为你最终可能想要其他形式的继承而不是-per-table,或者EF的任何其他功能,那就去吧!
您应该进行转换的第一个原因:实体框架体验在您的简历中看起来不错!