现在,.NET v3.5 SP1已经发布(与VS2008 SP1一起发布),我们现在可以访问.NET实体框架。

我的问题是这个。当试图决定使用实体框架和LINQ to SQL作为ORM时,有什么区别?

按照我的理解,实体框架(当与LINQ to Entities一起使用时)是LINQ to SQL的“大哥”?如果是这样的话,它有什么好处?LINQ to SQL不能单独做什么?


当前回答

我发现在使用EF时,我不能在同一个数据库模型中使用多个数据库。但在linq2sql中,我只需在模式名称前面加上数据库名称即可。

这是我最初开始使用linq2sql的原因之一。我不知道EF是否已经允许这一功能,但我记得读到它的初衷是不允许这一点。

其他回答

我认为快速而肮脏的答案是

LINQ to SQL是实现这一目标的快速简便的方法。这意味着如果你正在做一些小的事情,你会更快地完成任务,更快地交付。实体框架是一种全面、无限制的方法。这意味着如果你在做更大的事情,你会提前花更多的时间,发展得更慢,并且有更大的灵活性。

这里的答案涵盖了Linq2Sql和EF之间的许多差异,但有一个关键点没有得到太多关注:Linq2Sql只支持SQL Server,而EF为以下RDBMS提供了提供程序:

由Microsoft提供:

用于SQL Server、OBDC和OLE DB的ADO.NET驱动程序

通过第三方提供商:

MySQL数据库神谕分布式数据库维斯塔数据库数据库PostgreSQLInformix公司U2型Sybase公司Synergex公司火鸟Npgsql语言

举几个例子。

这使得EF成为关系数据存储的强大编程抽象,这意味着无论底层数据存储如何,开发人员都可以使用一致的编程模型。这在开发产品时非常有用,您希望确保产品能够与广泛的通用RDBMS互操作。

这种抽象有用的另一种情况是,您是一个开发团队的一部分,该团队与许多不同的客户或组织内的不同业务部门合作,您希望通过减少他们必须熟悉的RDBMS的数量来提高开发人员的生产力,以便在不同的RDBMS之上支持一系列不同的应用程序。

这里有一些指标。。。(量化事物!!!)

我在使用实体框架的地方进行了这个查询

var result = (from metattachType in _dbContext.METATTACH_TYPE
                join lineItemMetattachType in _dbContext.LINE_ITEM_METATTACH_TYPE on metattachType.ID equals lineItemMetattachType.METATTACH_TYPE_ID
                where (lineItemMetattachType.LINE_ITEM_ID == lineItemId && lineItemMetattachType.IS_DELETED == false
                && metattachType.IS_DELETED == false)
                select new MetattachTypeDto()
                {
                    Id = metattachType.ID,
                    Name = metattachType.NAME
                }).ToList();

并将其更改为我使用的存储库模式Linq公司

            return await _attachmentTypeRepository.GetAll().Where(x => !x.IsDeleted)
                .Join(_lineItemAttachmentTypeRepository.GetAll().Where(x => x.LineItemId == lineItemId && !x.IsDeleted),
                attachmentType => attachmentType.Id,
                lineItemAttachmentType => lineItemAttachmentType.MetattachTypeId,
                (attachmentType, lineItemAttachmentType) => new AttachmentTypeDto
                {
                    Id = attachmentType.Id,
                    Name = attachmentType.Name
                }).ToListAsync().ConfigureAwait(false);

Linq到sql

            return (from attachmentType in _attachmentTypeRepository.GetAll()
                    join lineItemAttachmentType in _lineItemAttachmentTypeRepository.GetAll() on attachmentType.Id equals lineItemAttachmentType.MetattachTypeId
                    where (lineItemAttachmentType.LineItemId == lineItemId && !lineItemAttachmentType.IsDeleted && !attachmentType.IsDeleted)
                    select new AttachmentTypeDto()
                    {
                        Id = attachmentType.Id,
                        Name = attachmentType.Name
                    }).ToList();

另外,请知道Linq to Sql比Linq快14倍。。。

LINQ to SQL真的死了吗?Jonathan Allen为InfoQ.com撰写

马特·沃伦(Matt Warren)将[LINQ to SQL]描述为“根本就不应该存在”的东西。从本质上讲,在真正的ORM准备就绪之前,它只是应该帮助他们开发LINQ。...实体框架的规模导致它错过了.NET 3.5/VVisual Studio 2008的最后期限。它及时完成了不幸命名为“.NET 3.5 Service Pack 1”,它更像是一个主要版本,而不是一个Service Pack。...由于复杂性,开发人员不喜欢[ADO.NET实体框架]。...从.NET 4.0开始,LINQ to Entities将是LINQ to关系场景的推荐数据访问解决方案。

我正在为一个使用Linq to SQL的大型项目的客户工作。当项目开始时,这是一个明显的选择,因为当时实体框架缺乏一些主要功能,Linq to SQL的性能要好得多。

现在EF已经进化,Linq to SQL缺少异步支持,这对于高度可扩展的服务非常有用。我们有时每秒有100多个请求,尽管我们已经优化了数据库,但大多数查询仍然需要几毫秒才能完成。由于同步数据库调用,线程被阻塞,无法用于其他请求。

我们正考虑切换到实体框架,仅用于此功能。遗憾的是,微软没有在Linq to SQL中实现异步支持(或者开源,所以社区可以这样做)。

2018年12月补遗:微软正在向.NET Core迁移,而Linq-2-SQL在.NET Core上不受支持,因此您需要迁移到EF,以确保将来可以迁移到EF.Core。

还有一些其他选项需要考虑,例如LLBLGen。它是一个成熟的ORM解决方案,已经存在了很长时间,并且已经被证明比MS数据解决方案(ODBC、ADO、ADO.NET、Linq-2-SQL、EF、EF.core)更具未来性。