Entity Framework vs LINQ para SQL

Agora que o .NET v3.5 SP1 foi lançado (junto com o VS2008 SP1), agora temos access à estrutura de entidades .NET.

Minha pergunta é essa. Ao tentar decidir entre usar o Entity Framework e o LINQ to SQL como um ORM, qual é a diferença?

A maneira que eu entendo, o Entity Framework (quando usado com o LINQ to Entities) é um ‘big brother’ para o LINQ to SQL? Se este for o caso – que vantagens tem? O que pode fazer que o LINQ to SQL não possa fazer sozinho?

    O LINQ to SQL suporta apenas o mapeamento de 1 a 1 das tabelas, exibições, sprocs e funções do database disponíveis no Microsoft SQL Server. É uma ótima API para usar a construção de access rápido a bancos de dados do SQL Server relativamente bem projetados. O LINQ2SQL foi lançado pela primeira vez com o C # 3.0 e o .Net Framework 3.5.

    LINQ para Entidades (ADO.Net Entity Framework) é uma API ORM (Object Relational Mapper) que permite uma ampla definição de modelos de domínio de object e seus relacionamentos com muitos provedores de dados ADO.Net diferentes. Como tal, você pode misturar e combinar vários fornecedores de bancos de dados, servidores de aplicativos ou protocolos para projetar um mash-up agregado de objects que são construídos a partir de uma variedade de tabelas, fonts, serviços, etc. O ADO.Net Framework foi lançado com o .Net Framework 3.5 SP1.

    Este é um bom artigo introdutório no MSDN: Introdução ao LINQ para dados relacionais

    Eu acho que a resposta rápida e suja é que

    • O LINQ to SQL é a maneira rápida e fácil de fazer isso. Isso significa que você irá mais rápido e entregará mais rápido se estiver trabalhando em algo menor.
    • O Entity Framework é a maneira completa e sem restrições de fazê-lo. Isso significa que você levará mais tempo à frente, desenvolverá mais lentamente e terá mais flexibilidade se estiver trabalhando em algo maior.

    O LINQ to SQL está realmente morto? de Jonathan Allen para InfoQ.com

    Matt Warren descreve [LINQ to SQL] como algo que “nunca deveria existir”. Essencialmente, era suposto ser um substituto para ajudá-los a desenvolver o LINQ até que o verdadeiro ORM estivesse pronto.

    A escala do Entity Framework fez com que perdesse o prazo final do .NET 3.5 / Visual Studio 2008. Ele foi concluído a tempo para o infelizmente chamado “.NET 3.5 Service Pack 1”, que era mais como uma versão principal do que como um service pack.

    Os desenvolvedores não gostam do [ADO.NET Entity Framework] devido à complexidade.

    a partir do .NET 4.0, o LINQ to Entities será a solução de access a dados recomendada para o LINQ para cenários relacionais.

    Existem várias diferenças óbvias descritas no artigo @lars postadas, mas a resposta curta é:

    • L2S é fortemente acoplado – propriedade de object para campo específico de database ou mais corretamente mapeamento de object para um esquema de database específico
    • L2S só funcionará com o SQL Server (tanto quanto eu sei)
    • EF permite mapear uma única class para múltiplas tabelas
    • A EF lidará com relacionamentos MM
    • A EF terá a capacidade de direcionar qualquer provedor de dados do ADO.NET

    A premissa original era L2S é para Rapid Development, e EF para mais aplicações “enterprisey” de n-tier, mas que está vendendo L2S um pouco curto.

    LINQ para SQL

    1. Fonte de dados homogênea: SQL Server
    2. Recomendado para projetos pequenos somente onde a estrutura de dados é bem projetada
    3. O mapeamento pode ser alterado sem recompilar com o SqlMetal.exe
    4. .dbml (linguagem de marcação de database)
    5. Mapeamento um-para-um entre tabelas e classs
    6. Suporta inheritance TPH
    7. Não suporta tipos complexos
    8. Abordagem de armazenamento primeiro
    9. Visão cinput no database de um database
    10. Criado pela equipe do C #
    11. Apoiado, mas não melhorias adicionais pretendidas

    Estrutura de entidade

    1. Fonte de dados Heterogeneus: Suporta muitos provedores de dados
    2. Recomendado para todos os novos projetos, exceto:
      • pequenos (LINQ para SQL)
      • quando a fonte de dados é um arquivo simples (ADO.NET)
    3. O mapeamento pode ser alterado sem recompilation ao definir arquivos de modelo e mapeamento Processo de Artefato de Metadados para Copiar para Diretório de Saída
    4. .edmx (Entity Data Model), que contém:
      • SSDL (Linguagem de Definição de Esquema de Armazenamento)
      • CSDL (linguagem conceitual de definição de esquema)
      • MSL (Linguagem de Especificação de Mapeamento)
    5. Mapeamentos um-para-um, um-para-muitos, muitos-para-um entre tabelas e classs
    6. Suporta inheritance:
      • TPH (tabela por hierarquia)
      • TPT (tabela por tipo)
      • TPC (tabela por class de concreto)
    7. Suporta tipos complexos
    8. Primeiro código, primeiro modelo, primeiro armazenamento
    9. Visão cinput no aplicativo de um database
    10. Criado pela equipe do SQL Server
    11. Futuro das APIs de dados da Microsoft

    Veja também:

    • LINQ para SQL Vs Entity Framework
    • Diferença entre o LINQ to SQL e o Entity Framework
    • Entity Framework vs LINQ TO SQL

    Minha experiência com o Entity Framework tem sido menos que escanvasr. Primeiro, você tem que herdar das classs base da EF, então diga adeus aos POCOs. Seu design terá que estar ao redor da EF. Com o LinqtoSQL eu poderia usar meus objects de negócios existentes. Além disso, não há carregamento lento, você tem que implementar isso sozinho. Há alguns trabalhos por aí para usar POCOs e carregamento lento, mas existem IMHO porque a EF ainda não está pronta. Eu pretendo voltar a ele depois de 4.0

    Eu encontrei uma resposta muito boa aqui que explica quando usar o que em palavras simples:

    A regra básica para qual estrutura usar é como planejar a edição de seus dados na sua camada de apresentação.

    • Linq-To-Sql – use este framework se você planeja editar um relacionamento um-para-um dos seus dados em sua camada de apresentação. Significa que você não planeja combinar dados de mais de uma tabela em qualquer visão ou página.

    • Entity Framework – use essa estrutura se você planeja combinar dados de mais de uma tabela em sua visualização ou página. Para tornar isso mais claro, os termos acima são específicos dos dados que serão manipulados em sua visualização ou página, não apenas exibidos. Isso é importante para entender.

    Com o Entity Framework você é capaz de “mesclar” dados tabelados juntos para apresentar a camada de apresentação em um formato editável, e quando esse formulário é submetido, a EF saberá como atualizar TODOS os dados das várias tabelas.

    Provavelmente existem razões mais precisas para escolher EF sobre L2S, mas este provavelmente seria o mais fácil de entender. O L2S não tem a capacidade de mesclar dados para apresentação de visualizações.

    Minha impressão é que o seu database é bastante enorme ou muito mal projetado se o Linq2Sql não se encheckbox em suas necessidades. Eu tenho cerca de 10 sites maiores e menores usando Linq2Sql. Eu olhei e framework Entity muitas vezes, mas não consigo encontrar uma boa razão para usá-lo sobre Linq2Sql. Dito isso, tento usar meus bancos de dados como modelo, portanto, já tenho um mapeamento 1 a 1 entre o modelo e o database.

    No meu trabalho atual, temos um database com mais de 200 tabelas. Um database antigo com muitas soluções ruins para que eu pudesse ver o benefício do Entity Framework sobre o Linq2Sql, mas ainda preferiria reprojetar o database, pois o database é o mecanismo do aplicativo e se o database for mal projetado e lento, também será lento. O uso da estrutura Entity em tal database parece ser uma rápida correção para disfarçar o modelo ruim, mas nunca poderia disfarçar o desempenho ruim obtido de um database desse tipo.

    As respostas aqui cobriram muitas das diferenças entre o Linq2Sql e o EF, mas há um ponto-chave que não recebeu muita atenção: o Linq2Sql suporta apenas o SQL Server, enquanto o EF tem provedores para os seguintes RDBMS:

    Fornecido pela Microsoft:

    • Drivers ADO.NET para SQL Server, OBDC e OLE DB

    Através de fornecedores de terceiros:

    • MySQL
    • Oráculo
    • DB2
    • VistaDB
    • SQLite
    • PostgreSQL
    • Informix
    • U2
    • Sybase
    • Synergex
    • Firebird
    • Npgsql

    para nomear alguns.

    Isso faz da EF uma poderosa abstração de programação em seu armazenamento de dados relacional, o que significa que os desenvolvedores têm um modelo de programação consistente para trabalhar, independentemente do armazenamento de dados subjacente. Isso pode ser muito útil em situações em que você está desenvolvendo um produto que deseja assegurar que irá interoperar com uma ampla gama de RDBMSs comuns.

    Outra situação em que essa abstração é útil é quando você faz parte de uma equipe de desenvolvimento que trabalha com vários clientes diferentes ou diferentes unidades de negócios em uma organização e deseja melhorar a produtividade do desenvolvedor reduzindo o número de RDBMSs. familiarizado com a fim de suportar uma gama de diferentes aplicações em cima de diferentes RDBMS.

    Descobri que não podia usar vários bancos de dados no mesmo modelo de database ao usar o EF. Mas no linq2sql eu poderia apenas prefixar os nomes dos esquemas com os nomes dos bancos de dados.

    Esta foi uma das razões pelas quais comecei a trabalhar com o linq2sql. Eu não sei se a EF ainda permitiu essa funcionalidade, mas lembro-me de ter lido que isso era para não permitir isso.

    Se o seu database for direto e simples, o LINQ to SQL funcionará. Se você precisar de entidades lógicas / abstraídas na parte superior de suas tabelas, vá para Entity Framework.

    Ainda não suporta os tipos de dados exclusivos do SQL 2008. A diferença da minha perspectiva é que Entity ainda tem a chance de construir um modelo em torno do meu tipo de dados geocharts em alguma versão futura, e o Linq to SQL, sendo abandonado, nunca será.

    Pergunto o que há com nHibernate ou OpenAccess …

    Eu acho que se você precisa desenvolver algo rápido sem coisas estranhas no meio, e você precisa da facilidade de ter entidades representando suas tabelas:

    Linq2Sql pode ser um bom aliado, usá-lo com LinQ desencadeia um ótimo tempo de desenvolvimento.

    Eu estou trabalhando para o cliente que tem um grande projeto que está usando o Linq-to-SQL. Quando o projeto começou, foi a escolha óbvia, porque o Entity Framework carecia de alguns resources importantes na época e o desempenho do Linq-to-SQL era muito maior.

    Agora a EF evoluiu e o Linq-to-SQL carece de um recurso importante para serviços altamente escalonáveis ​​e que é o suporte para operações assíncronas. Temos mais de 100 solicitações por segundo, às vezes, e apesar de otimizarmos nossos bancos de dados, a maioria das consultas ainda leva vários milissegundos para ser concluída. Por causa das chamadas de database síncronas, o encadeamento é bloqueado e não está disponível para outras solicitações.

    Estamos pensando em mudar para o Entity Framework, apenas para esse recurso. É uma pena que a Microsoft não tenha implementado o suporte asynchronous no Linq-to-SQL (ou de código aberto, para que a comunidade possa fazê-lo).

    O LINQ to SQL e o Entity Framework parecem semelhantes na superfície. Ambos fornecem consultas LINQ em um database usando um modelo de dados.

    O LINQ to SQL evoluiu a partir do projeto LINQ, que surgiu da equipe que trabalha com desenvolvimento de linguagem. Enquanto o Entity Framework era um projeto da equipe de Data Programmability e estava focado na linguagem Entity SQL. A Microsoft não tem intenção de descartar o LINQ to SQL.

    O LINQ to SQL ainda é parte do ADO.NET, enquanto o framework Entity possui uma API separada. Entity framework é a versão superior do LINQ to SQL.Entity framework usa o Entity Data Model para fazer a ponte entre o seu aplicativo e o seu armazenamento de dados. É o Entity Data Model, ou EDM, que fornece a definição de seu esquema conceitual, bem como as informações do esquema do database necessárias para interagir com o database e, finalmente, um esquema de mapeamento vinculado a dois.

    Aqui estão algumas tarefas executadas pelo Entity Framework (modelo de dados de entidade).

    • Gera classs automaticamente a partir do modelo e atualiza essas classs dinamicamente sempre que o modelo é alterado.

    • Cuida de toda a conectividade do database, para que os desenvolvedores não sejam sobrecarregados com a necessidade de escrever muitos códigos para interagir com o database.

    • Fornece uma syntax de consulta comum para consultar o modelo, não o database, e então converte essas consultas em consultas que o database pode entender.

    • Fornece um mecanismo para rastrear alterações nos objects do modelo à medida que eles são usados ​​nos aplicativos e lida com as atualizações no database.

    Linq para SQL

    É provedor que suporta apenas o SQL Server. É uma tecnologia de mapeamento para mapear tabelas de database do SQL Server para objects .NET. É a primeira tentativa da Microsoft em um ORM – Object-Relational Mapper.

    Linq para Entidades

    É a mesma idéia, mas usando Entity Framework em segundo plano, como o ORM – novamente da Microsoft, Ele suporta múltiplas vantagens principais database da entidade framework é desenvolvedor pode trabalhar em qualquer database não há necessidade de aprender a syntax para realizar qualquer operação em diferentes bancos de dados

    De acordo com minha experiência pessoal, Ef é melhor (se você não tem idéia sobre SQL), o desempenho no LINQ é um pouco mais rápido, como comparar com a linguagem LINQ da LIN, escrita em lambda.