sqlquery query framework executesqlcommand ejemplos data consulta columns .net entity-framework linq-to-sql

.net - query - linq to sql or entity framework



Entity Framework vs LINQ to SQL (17)

Ahora que se ha lanzado .NET v3.5 SP1 (junto con VS2008 SP1), ahora tenemos acceso al marco de la entidad .NET.

Mi pregunta es la siguiente. Cuando se trata de decidir entre usar Entity Framework y LINQ to SQL como ORM, ¿cuál es la diferencia?

De la forma en que lo entiendo, el Entity Framework (cuando se usa con LINQ to Entities) es un "hermano mayor" de LINQ to SQL? Si este es el caso, ¿qué ventajas tiene? ¿Qué puede hacer que LINQ to SQL no pueda hacer por sí solo?


Linq-to-SQL

Es el proveedor que solo soporta SQL Server. Es una tecnología de asignación para asignar tablas de base de datos de SQL Server a objetos .NET. Es el primer intento de Microsoft en un ORM - Object-Relational Mapper.

Linq-to-Entities

Es la misma idea, pero el uso de Entity Framework en segundo plano, como el ORM, una vez más de Microsoft, el desarrollador puede trabajar en cualquier base de datos sin necesidad de aprender la sintaxis para realizar cualquier operación en diferentes bases de datos.

De acuerdo con mi experiencia personal, el rendimiento de Ef es mejor (si no tiene idea de SQL) en LINQ es un poco más rápido en comparación con el lenguaje EF de LINQ escrito en lambda.


LINQ to SQL

  1. Fuente de datos homogénea: SQL Server
  2. Recomendado para proyectos pequeños solo donde la estructura de datos está bien diseñada
  3. La asignación se puede cambiar sin volver a compilar con SqlMetal.exe
  4. .dbml (lenguaje de marcado de base de datos)
  5. Mapeo uno a uno entre tablas y clases
  6. Apoya la herencia TPH
  7. No soporta tipos complejos
  8. Enfoque de almacenamiento primero
  9. Vista centrada en la base de datos de una base de datos
  10. Creado por el equipo C #
  11. Soportado pero no otras mejoras previstas

Marco de la entidad

  1. Fuente de datos heterogénea: soporta muchos proveedores de datos
  2. Recomendado para todos los proyectos nuevos excepto:
    • los pequeños (LINQ a SQL)
    • cuando la fuente de datos es un archivo plano (ADO.NET)
  3. La asignación se puede cambiar sin volver a compilar al configurar el modelo y los archivos de asignación Proceso de artefacto de metadatos para copiar al directorio de salida
  4. .edmx (modelo de datos de entidad) que contiene:
    • SSDL (lenguaje de definición de esquema de almacenamiento)
    • CSDL (lenguaje de definición de esquema conceptual)
    • MSL (Lenguaje de especificación de mapeo)
  5. Asignaciones uno a uno, uno a muchos, muchos a uno entre tablas y clases
  6. Apoya la herencia:
    • TPH (tabla por jerarquía)
    • TPT (tabla por tipo)
    • TPC (tabla por clase concreta)
  7. Soporta tipos complejos
  8. Código primero, Modelo primero, Almacenamiento primero
  9. Vista centrada en la aplicación de una base de datos
  10. Creado por el equipo de SQL Server
  11. Futuro de las API de datos de Microsoft

Ver también:


Creo que la respuesta rápida y sucia es que

  • LINQ to SQL es la forma rápida y fácil de hacerlo. Esto significa que irá más rápido y entregará más rápido si está trabajando en algo más pequeño.
  • Entity Framework es la forma total y sin restricciones de hacerlo. Esto significa que tomará más tiempo por adelantado, desarrollará más lento y tendrá más flexibilidad si está trabajando en algo más grande.

Creo que si necesitas desarrollar algo rápido sin cosas extrañas en el medio, y necesitas la facilidad para tener entidades que representen tus tablas:

Linq2Sql puede ser un buen aliado, usarlo con LinQ desencadena un gran momento de desarrollo.


Descubrí que no podía usar varias bases de datos dentro del mismo modelo de base de datos cuando utilizaba EF. Pero en linq2sql solo pude prefijar los nombres de esquema con nombres de base de datos.

Esta fue una de las razones por las que originalmente comencé a trabajar con linq2sql. No sé si EF ya ha permitido esta funcionalidad, pero recuerdo haber leído que estaba destinado a no permitirlo.


Encontré una muy buena respuesta here que explica cuándo usar qué con palabras simples:

La regla básica para qué marco usar es cómo planear la edición de sus datos en su capa de presentación.

  • Linq-To-Sql : use este marco si planea editar una relación uno a uno de sus datos en su capa de presentación. Lo que significa que no planea combinar datos de más de una tabla en una vista o página.

  • Entity Framework : use este marco si planea combinar datos de más de una tabla en su vista o página. Para que esto quede más claro, los términos anteriores son específicos de los datos que se manipularán en su vista o página, no solo se muestran. Esto es importante de entender.

Con el Entity Framework, puede "fusionar" los datos en tablas para presentarlos a la capa de presentación en una forma editable, y luego, cuando se envíe ese formulario, EF sabrá cómo actualizar TODOS los datos de las distintas tablas.

Probablemente hay razones más precisas para elegir EF en lugar de L2S, pero esta sería probablemente la más fácil de entender. L2S no tiene la capacidad de combinar datos para la presentación de vista.


Estoy trabajando para un cliente que tiene un gran proyecto que usa Linq-to-SQL. Cuando se inició el proyecto, fue la elección obvia, ya que Entity Framework carecía de algunas características importantes en ese momento y el rendimiento de Linq-a-SQL era mucho mejor.

Ahora EF ha evolucionado y Linq-to-SQL carece de una característica importante para servicios altamente escalables y es el soporte para operaciones asíncronas. Algunas veces tenemos más de 100 solicitudes por segundo y, a pesar de que hemos optimizado nuestras bases de datos, la mayoría de las consultas todavía tardan varios milisegundos en completarse. Debido a las llamadas a la base de datos síncrona, el hilo está bloqueado y no está disponible para otras solicitudes.

Estamos pensando en cambiar a Entity Framework, únicamente para esta función. Es una pena que Microsoft no haya implementado el soporte asíncrono en Linq-to-SQL (o que sea de código abierto, para que la comunidad pueda hacerlo).


Hay una serie de diferencias obvias descritas en el artículo @lars publicado, pero la respuesta corta es:

  • L2S está estrechamente acoplado: propiedad de objeto a un campo específico de la base de datos o, más correctamente, asignación de objetos a un esquema de base de datos específico
  • L2S solo funcionará con SQL Server (que yo sepa)
  • EF permite asignar una sola clase a varias tablas
  • EF manejará las relaciones de MM
  • EF tendrá la capacidad de dirigirse a cualquier proveedor de datos ADO.NET

La premisa original era que L2S es para Rapid Development, y EF para más aplicaciones "n" de nivel empresarial, pero eso es vender L2S un poco corto.


LINQ to SQL solo admite la asignación 1 a 1 de tablas de base de datos, vistas, referencias y funciones disponibles en Microsoft SQL Server. Es una excelente API para usar en la construcción de acceso rápido a datos en bases de datos de SQL Server relativamente bien diseñadas. LINQ2SQL se lanzó por primera vez con C # 3.0 y .Net Framework 3.5.

LINQ to Entities (ADO.Net Entity Framework) es una API de ORM (Object Relational Mapper) que permite una amplia definición de los modelos de dominio de objetos y sus relaciones con muchos proveedores de datos ADO.Net diferentes. Como tal, puede mezclar y combinar un número de diferentes proveedores de bases de datos, servidores de aplicaciones o protocolos para diseñar una combinación agregada de objetos que se construyen a partir de una variedad de tablas, fuentes, servicios, etc. ADO.Net Framework se lanzó con El .Net Framework 3.5 SP1.

Este es un buen artículo introductorio en MSDN: Introducción de LINQ a datos relacionales


LINQ to SQL y Entity Framework se ven similares en la superficie. Ambos proporcionan consultas LINQ contra una base de datos utilizando un modelo de datos.

LINQ to SQL evolucionó a partir del proyecto LINQ, que surgió del equipo que trabajaba con el desarrollo del lenguaje. Mientras que Entity Framework era un proyecto del equipo de Programabilidad de Datos y estaba centrado en el lenguaje Entity SQL. Microsoft no tiene realmente ninguna intención de restar LINQ a SQL.

LINQ to SQL sigue siendo parte de ADO.NET, mientras que Entity Framework tiene una API separada. Entity framework es la versión superior de LINQ to SQL.Entity framework usa Entity Data Model para enlazar entre su aplicación y su almacén de datos. Es el Modelo de datos de entidad, o EDM, el que proporciona la definición de su esquema conceptual, así como la información de esquema de base de datos necesaria para interactuar con la base de datos y, finalmente, un esquema de mapeo que se vincula a dos.

Aquí hay algunas tareas realizadas por Entity Framework (modelo de datos de entidad).

• Genera automáticamente clases a partir del modelo y las actualiza dinámicamente cada vez que el modelo cambia.

• Se encarga de toda la conectividad de la base de datos para que los desarrolladores no se sientan agobiados por tener que escribir muchos códigos para interactuar con la base de datos.

• Proporciona una sintaxis de consulta común para consultar el modelo, no la base de datos, y luego traduce estas consultas en consultas que la base de datos puede comprender.

• Proporciona un mecanismo para rastrear los cambios en los objetos del modelo a medida que se usan en las aplicaciones y maneja las actualizaciones a la base de datos.


Las respuestas aquí han cubierto muchas de las diferencias entre Linq2Sql y EF, pero hay un punto clave al que no se le ha prestado mucha atención: Linq2Sql solo es compatible con SQL Server mientras que EF tiene proveedores para los siguientes RDBMS:

Proporcionado por Microsoft:

  • Controladores ADO.NET para SQL Server, OBDC y OLE DB

A través de proveedores externos:

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

para nombrar unos pocos.

Esto convierte a EF en una poderosa abstracción de programación sobre su almacén de datos relacionales, lo que significa que los desarrolladores tienen un modelo de programación coherente con el que trabajar, independientemente del almacén de datos subyacente. Esto podría ser muy útil en situaciones en las que está desarrollando un producto que desea asegurar que interoperará con una amplia gama de RDBMS comunes.

Otra situación en la que esa abstracción es útil es cuando forma parte de un equipo de desarrollo que trabaja con varios clientes diferentes o diferentes unidades de negocios dentro de una organización, y desea mejorar la productividad de los desarrolladores al reducir la cantidad de RDBMS que deben convertirse. familiarizados con el fin de admitir una gama de diferentes aplicaciones sobre diferentes RDBMS.


Mi experiencia con Entity Framework ha sido menos que estelar. Primero, debe heredar de las clases base de EF, así que despídase de los POCO. Tu diseño tendrá que estar alrededor de la EF. Con LinqtoSQL podría usar mis objetos comerciales existentes. Además, no hay carga perezosa, tienes que implementarlo tú mismo. Hay algunos arreglos de trabajo por ahí para usar POCOs y carga lenta, pero existen en mi humilde opinión porque EF aún no está listo. Tengo la intención de volver a ella después de 4.0


Mi impresión es que su base de datos es bastante grande o está muy mal diseñada si Linq2Sql no satisface sus necesidades. Tengo alrededor de 10 sitios web, tanto más grandes como más pequeños, todos utilizando Linq2Sql. He mirado y Entity framework muchas veces, pero no puedo encontrar una buena razón para usarlo sobre Linq2Sql. Dicho esto, trato de usar mis bases de datos como modelo, así que ya tengo una asignación 1 a 1 entre el modelo y la base de datos.

En mi trabajo actual tenemos una base de datos con más de 200 tablas. Una base de datos antigua con muchas soluciones malas, por lo que podría ver el beneficio de Entity Framework sobre Linq2Sql pero aún así preferiría rediseñar la base de datos ya que la base de datos es el motor de la aplicación y si la base de datos está mal diseñada y es lenta, entonces mi aplicación También será lento. El uso de Entity framework en una base de datos de este tipo parece ser una solución rápida para ocultar el mal modelo, pero nunca podría ocultar el mal desempeño que se obtiene de dicha base de datos.


Ninguno de los dos admite los tipos de datos únicos de SQL 2008. La diferencia desde mi perspectiva es que la Entidad aún tiene la oportunidad de construir un modelo alrededor de mi tipo de datos geográficos en alguna versión futura, y que Linq to SQL, al ser abandonado, nunca lo hará.

Me pregunto qué pasa con nHibernate, o OpenAccess ...


Si su base de datos es directa y simple, LINQ to SQL funcionará. Si necesita entidades lógicas / abstractas en la parte superior de sus tablas, vaya a Entity Framework.


¿LINQ to SQL Truly Dead? por Jonathan Allen para InfoQ.com

Matt Warren describe [LINQ to SQL] como algo que "nunca se suponía que existiera". Esencialmente, se suponía que debía ser un complemento para ayudarles a desarrollar LINQ hasta que el ORM real estuviera listo.

...

La escala de Entity Framework hizo que se perdiera la fecha límite de .NET 3.5 / Visual Studio 2008. Se completó a tiempo para el desafortunadamente llamado ".NET 3.5 Service Pack 1", que se parecía más a una versión principal que a un service pack.

...

A los desarrolladores no les gusta [ADO.NET Entity Framework] debido a la complejidad.

...

a partir de .NET 4.0, LINQ to Entities será la solución de acceso a datos recomendada para LINQ a escenarios relacionales.