Entity Framework vs LINQ to SQL

828

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 esta Al tratar de decidir entre usar Entity Framework y LINQ to SQL como ORM, ¿cuál es la diferencia?

Según tengo entendido, el Entity Framework (cuando se usa con LINQ to Entities) es un 'gran hermano' para LINQ to SQL. Si este es el caso, ¿qué ventajas tiene? ¿Qué puede hacer que LINQ to SQL no pueda hacer por sí solo?

Chris Roberts
fuente
138
Creo que las respuestas a continuación deberían reexaminarse debido al largo tiempo desde que se lanzó EF, por lo que los nuevos desarrolladores que llegan aquí pueden tener una impresión equivocada. EF se convirtió en una herramienta GRANDE y FÁCIL desde su lanzamiento temprano. Simplemente configura la conexión a la base de datos y es el 90% de todo lo que necesita. ¡Desarrollo muy rápido, desde el punto de vista experimentado! A partir de ahí, LINQ es tu mejor amigo. Es altamente personalizable, MVC simplemente lo ama, y ​​para las personas que dicen que es malo: ¡aprenda cómo usarlo primero (y obtenga LINQ también)!
graumanoz
10
Solo para que quede claro, no es como si tuvieras que elegir ahora, MSFT efectivamente eliminó a LINQ2SQL a favor de EF. Sin embargo, el hecho de que el EF de fuente abierta de MSFT lo ayudó a succionar menos y definitivamente está mejorando. Pero para cualquiera que ingrese a EF, asegúrese de comprender que todavía hay muchas peculiaridades en EF. He publicado sobre uno - stackoverflow.com/questions/305092/…
nikib3ro
44
@ kape123, (a) LINQ to SQL no está "muerto"; todavía es utilizable; (b) LINQ to SQL es el método estándar de acceso a datos en el desarrollo de Windows Phone 8.
Ryan Lundy
99
@ user3308043, [cita requerida].
Ryan Lundy
3
@ Kyralessa: a partir de 2010 (con el lanzamiento de .NET4.0, la cita más reciente que pude encontrar), MS reconoció que , si bien se puede hacer alguna inversión en LINQ2SQL, "la mayor parte de nuestra inversión total estará en la Entidad Marco de referencia."
kmote

Respuestas:

483

LINQ to SQL solo admite el mapeo 1 a 1 de tablas de base de datos, vistas, sprocs y funciones disponibles en Microsoft SQL Server. Es una gran API para usar para la construcción de acceso rápido a datos en bases de datos 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 ORM (Object Relational Mapper) que permite una definición amplia de modelos de dominio de objetos y sus relaciones con muchos proveedores de datos ADO.Net diferentes. Como tal, puede mezclar y combinar 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 fue lanzado con .Net Framework 3.5 SP1.

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

Kris
fuente
parece que usa LINQ to SQL para consultar en el EF
PositiveGuy
11
@CoffeeAddict, aunque tienen un estilo muy similar con las lambdas de LINQ, cada API tiene bases completamente diferentes. Por ejemplo, la forma en que LINQ2SQL genera consultas SQL permite el uso de funciones SQL, mientras que L2E no lo hace, o al menos no lo hizo a partir de 2008.
Kris
2
El enfoque orientado a objetos EF lo hace realmente fácil y conveniente de usar, puede codificarse muy rápido y administrarse. Para mí, la mejor manera de acceder a los datos.
Antoine Pelletier
10
Esta respuesta es obsoleta. Ahora Linq to SQL admite el mapeo one2many
George Lanetz
201

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 comenzará 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 de hacerlo sin restricciones. Esto significa que tomará más tiempo por adelantado, se desarrollará más lentamente y tendrá más flexibilidad si está trabajando en algo más grande.
Brad Tutterow
fuente
32
También tenderá a escribir menos líneas de código con L2S para lograr lo mismo que haría con EF. Sin carga lenta en EF significa que siempre está verificando si algo se cargó o no.
Paul Mendoza
Brad, ¿qué sugerirías para un sitio de comercio electrónico? Quiero decir que no puedo ver nada más que simples CRUDs allí ...
PositiveGuy
2
@CoffeeAddict obviamente, el top 3 de la respuesta más votada dice L2S para CRUD simple
IsmailS
11
@Banford Con EF en .NET 4.0 Creo que es mejor que L2S. Las características que faltaban en EF en 3.5 que L2S se habían agregado a EF en .NET 4.0. Sus declaraciones de LINQ ahora en EF en .NET 4.0 se verán muy parecidas a las de L2S. EF le ofrece algunas cosas adicionales que puede hacer ahora además de lo que ofrece L2S.
Paul Mendoza
40
Esta respuesta tiene ahora 5 años y está bastante desactualizada. Entity Framework 6 está ahora en fase beta y se ha mejorado mucho, incluye Lazy carga, el apoyo de enumeración, etc, etc
Tim
109

¿LINQ to SQL está realmente muerto? 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 suplente para ayudarlos a desarrollar LINQ hasta que el ORM real estuviera listo.

...

La escala de Entity Framework hizo que perdiera la fecha límite de .NET 3.5 / Visual Studio 2008. Se completó a tiempo para el lamentablemente 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 to escenarios relacionales.

Zack Peterson
fuente
56
En realidad, no nos gusta EF porque tiene un diseñador tan pobre y es extremadamente, muy defectuoso. Nunca he encontrado que sea tan complejo.
BlueRaja - Danny Pflughoeft
12
Muchos de los principales sitios de comercio electrónico utilizan LINQ to SQL. Ejemplos: Redbox, Stackoverflow, etc.
PositiveGuy
14
Conozco MUCHOS buenos desarrolladores que usan LINQ to SQL y dicen que estos artículos son totalmente exagerados. Estoy de acuerdo. LINQ to SQL se ha utilizado en potentes .coms y todavía lo es.
PositiveGuy
44
Sí, llamar a .ToString () en una propiedad de entero en una consulta L2EF no debería causar una excepción.
StingyJack
3
@ BlueRaja-DannyPflughoeft ¿Sigue siendo cierto después de más de 5 años?
Vikas Rana
94

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

  • L2S está estrechamente acoplado: propiedad del objeto al 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á relaciones MM
  • EF tendrá la capacidad de apuntar a cualquier proveedor de datos ADO.NET

La premisa original era que L2S es para desarrollo rápido y EF para aplicaciones de nivel n más "empresariales", pero eso está vendiendo L2S un poco corto.

JamesSugrue
fuente
13
Su cita "L2S solo funcionará con SQL Server (hasta donde yo sé)" necesita actualización: el proyecto de código abierto "dblinq" reemplaza el ensamblaje LINQ to SQL con uno que puede comunicarse con MySQL, PostgreSQL, Ingres, Firebird, SQLite. .. y Microsoft SQL (por supuesto).
Contango
1
espera ... ¿EF no crea objetos DL estrechamente acoplados?
PositiveGuy
77
sí, la premisa original de que L2S no es una solución empresarial capaz ya no es cierta. Me refiero a que StackOverflow se ejecuta en L2S y en un montón de otros .com como Redbox, y muchos más.
PositiveGuy
74

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 recompilar 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 de 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 de C #
  11. Mejoras admitidas pero no adicionales previstas

Marco de la entidad

  1. Fuente de datos heterogéneos: admite muchos proveedores de datos
  2. Recomendado para todos los proyectos nuevos excepto:
    • los pequeños (LINQ to SQL)
    • cuando la fuente de datos es un archivo plano (ADO.NET)
  3. La asignación se puede cambiar sin recompilar al configurar el modelo y los archivos de asignación Proceso de artefactos de metadatos para copiar en el 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 de hormigón)
  7. Admite tipos complejos
  8. Enfoques de 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:

Ryszard Dżegan
fuente
66
Esta es la respuesta más actual y detallada.
ErTR
2
¿Entity Framework no utiliza LINQ to SQL cuando, por ejemplo, está escribiendo un dbSet<Orders>.Where()...ToList()? Creo que es engañoso tener Entity Framework opuesto de LINQ a SQL.
Don Cheadle
44
@mmcrae EF no usa L2S, ambos son proveedores de linq para bases de datos subyacentes. Si lo interpreta como Linq-to-a-database, similar a linq-to-objects y linq-to-xml, entonces sí, ambos son similares en linq-to-a-database. Pero no, EF no usa L2S (o viceversa). Dos herramientas completamente separadas.
Maarten
44
"Recomendado para todos los proyectos nuevos excepto ... los pequeños" No estoy de acuerdo. Code First es una forma extremadamente rápida de comenzar a ejecutar proyectos pequeños. Aparte de eso, gran actualización de esta pregunta.
DrewJordan
51

Mi experiencia con Entity Framework ha sido menos que estelar. Primero, debe heredar de las clases base EF, así que despídase de los POCO. Su diseño tendrá que estar alrededor del EF. Con LinqtoSQL podría usar mis objetos comerciales existentes. Además, no hay carga diferida, debe implementarlo usted mismo. Existen algunas soluciones para usar POCO y carga diferida, pero existen en mi humilde opinión porque EF aún no está listo. Planeo volver después de 4.0

Jiyosub
fuente
77
La falta de soporte de POCO es la razón número uno por la que he elegido LINQ to SQL sobre Entity Framework. Puedo volver a visitar EF cuando lo incorporen en la próxima versión, como prometen. Hay algunos proyectos adicionales que hacen POCO para EF, pero no lo suficientemente limpios.
Joseph Ferris el
27
En caso de que alguien (como yo) no sepa lo que significa POCO: Objeto CLR simple y antiguo
CBono
44
Realmente no veo cuál es el gran alboroto por no apoyar POCOs ... es un nivel más de abstracción chicos. Cree una fábrica, inyectando el repositorio de datos y construya allí sus POCO. Probablemente sea una buena idea de todos modos.
EightyOne Unite
3
Escuché que POCO es posible en EF 4
PositiveGuy
8
El soporte de POCO está disponible en estos días y la herencia ya no es un requisito para las clases de entidad @CoffeeAddict POCO es solo un objeto simple sin depender de un marco específico y es una parte importante de los patrones del marco de entidad moderno
Chris McGrath
46

Encontré una muy buena respuesta aquí que explica cuándo usar qué en palabras simples:

La regla básica para qué marco usar es cómo planificar 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 sola 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 aclarar esto, los términos anteriores son específicos de los datos que serán manipulados en su vista o página, no solo mostrados. Esto es importante de entender.

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

Probablemente haya 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 fusionar datos para ver la presentación.

Nawaz
fuente
36

Mi impresión es que su base de datos es bastante enorme o está muy mal diseñada si Linq2Sql no se ajusta a sus necesidades. Tengo alrededor de 10 sitios web más grandes y más pequeños, todos con Linq2Sql. He buscado 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 un mapeo 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 para poder 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. Usar Entity Framework en una base de datos de este tipo parece una solución rápida para disfrazar el modelo malo, pero nunca podría disfrazar el mal rendimiento que obtienes de dicha base de datos.

terjetyl
fuente
1
Te falta el punto: incluso con bases de datos pequeñas, es posible que desees algo diferente a una relación 1: 1 entre las tablas de la base de datos y los objetos de código / dominio. Solo depende de la cantidad de abstracción que desee en los objetos de bus / dominio.
alquímico
18
Me he dado cuenta de que :) Hoy me gusta codificar a mano mis entidades comerciales. Todavía uso Linq2sql pero solo dentro de mis repositorios donde obtengo datos usando Linq2sql y convierto las entidades linq2sql en mis entidades comerciales personalizadas. Tal vez un poco más de trabajo que usar un o-mapper, pero aún así me gusta mantener mi capa empresarial libre de cualquier código específico de OR-mapper.
terjetyl
25

Puedes encontrar una buena comparación aquí:

ingrese la descripción de la imagen aquí

http://www.dotnet-tricks.com/Tutorial/entityframework/1M5W300314-Difference-between-LINQ-to-SQL-and-Entity-Framework.html

http://www.c-sharpcorner.com/blogs/entity-framework-vs-linq-to-sql1

Omer K
fuente
2
Algunas cosas en la respuesta no son correctas. No se requiere un EDMX si usa Code First. Y no entiendo cómo entra en juego DI cuando está usando Code First.
Maarten
1
Además, Linq to SQL puede llenar una base de datos de las clases de modelo muy bien. No estoy seguro de si también puede generar la base de datos en sí, pero generar el esquema y las tablas están dentro de las capacidades de Linq para SQL.
Tom Lint
Gracias por la respuesta, creo que se puede usar sqlmetal.exe docs.microsoft.com/en-us/dotnet/framework/tools/… para generar código / mapeo desde la base de datos cuando se usaLinq to SQL
Vinod Srivastav
23

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 admite 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
  • Pájaro de fuego
  • Npgsql

para nombrar unos pocos.

Esto hace que EF sea una abstracción de programación poderosa sobre su almacén de datos relacionales, lo que significa que los desarrolladores tienen un modelo de programación consistente para 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 garantizar que interopere con una amplia gama de RDBMS comunes.

Otra situación en la que esa abstracción es útil es cuando usted es 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 del desarrollador al reducir la cantidad de RDBMS que deben convertirse. familiarizado con el fin de admitir una gama de diferentes aplicaciones además de diferentes RDBMS.

saille
fuente
15

Descubrí que no podía usar varias bases de datos dentro del mismo modelo de base de datos cuando usaba EF. Pero en linq2sql podría simplemente prefijar los nombres de los esquemas con los nombres de las bases de datos.

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

Banford
fuente
12

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

vintana
fuente
44
Entity Framework permite una capa de abstracción de la parte superior de la base de datos. El problema con muchos OR Mappers hoy (en mi opinión) es que proporcionan un mapeo 1 a 1 entre tablas y clases. El modelo de base de datos no siempre refleja la forma en que lo pensamos en términos de un modelo de negocio.
senfo
Se quedó sin espacio. De todos modos, en base a lo que dije anteriormente, argumentaría que su respuesta no está completa.
senfo
77
Creo que este es realmente un mal consejo. L2S es bueno independientemente de la simplicidad o complejidad de su base de datos. La verdadera trampa es no tener una separación adecuada de las preocupaciones. Si intentas fusionar tu capa empresarial y tu capa de acceso a datos, y usas tus objetos Linqed para todo, entonces encontrarás que L2S es limitante. Pero eso es un problema con un diseño demasiado simplista y monolítico. L2S es un excelente DAL, y si considera que las consultas y la persistencia son una preocupación separada de las reglas de su negocio, se ahorrará muchos problemas en muchas áreas a largo plazo.
mattmc3
1
Esto no me dice nada. ¿Qué es simple en tus términos?
PositiveGuy
1
y qué quiere decir como un ejemplo de una necesidad de "lógico / abstraído". Sí, sé lo que es la abstracción, pero un ejemplo en tu contexto, por favor ... para explicarme exactamente lo que estás diciendo ... descríbelo, no solo me des jerga general ... eso es todo en relación con el hablante que dice esas palabras, así que no tengo idea de lo que quieres decir con esto.
PositiveGuy
8

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

Me pregunto qué pasa con nHibernate u OpenAccess ...

John Dunagan
fuente
3
Tipos de datos espaciales de SQL Server 2008 (Open Geospatial Consortium OGS) compatibles con Entity Framework 5. También se admiten otros proveedores (Devart para Oracle). Consulte msdn.microsoft.com/en-us/data/dn194325 .
subsci
6

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

Linq2Sql puede ser un buen aliado, usarlo con LinQ desata un excelente momento de desarrollo.

MRFerocius
fuente
44
"no hay cosas extrañas en el medio", ok, ¿qué quieres decir con esto? Ejemplo de una "cosa extraña en el medio"
PositiveGuy
Sería bueno editar o eliminar esta respuesta, ya no es útil para el desarrollo moderno y puede llevar a las personas por el camino equivocado.
Giulio Caccin
6

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

Ahora EF ha evolucionado y Linq-to-SQL carece de soporte asíncrono, lo cual es ideal para servicios altamente escalables. A 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 aún demoran varios milisegundos en completarse. Debido a las llamadas a la base de datos síncronas, 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 de código abierto, para que la comunidad pueda hacerlo).

Anexo Diciembre de 2018: Microsoft se está moviendo hacia .NET Core y Linq-2-SQL no es compatible con .NET Core, por lo que debe pasar a EF para asegurarse de que puede migrar a EF.Core en el futuro.

También hay algunas otras opciones a considerar, como LLBLGen . Es una solución ORM madura que existe desde hace mucho tiempo y se ha demostrado que está más preparada para el futuro que las soluciones de datos de MS (ODBC, ADO, ADO.NET, Linq-2-SQL, EF, EF.core).

Ramon de Klein
fuente
2

Linq-to-SQL

Es un proveedor que solo admite SQL Server. Es una tecnología de mapeo para mapear tablas de bases 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 usando Entity Framework en segundo plano, como ORM, nuevamente de Microsoft. Es compatible con múltiples bases de datos. La ventaja principal del marco de entidades es que 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 diferentes.

Según mi experiencia personal, Ef es mejor (si no tienes idea sobre SQL) el rendimiento en LINQ es un poco más rápido en comparación con el motivo EF por el lenguaje LINQ escrito en lambda.

Umang Patwa
fuente