¿Deberíamos usar Entity Framework?

31

Actualmente tenemos la siguiente pila:

  • VS 2005
  • Formularios web
  • SQL Server 2005
  • IIS 6

Estamos planeando hacer la transición a esto:

  • VS 2010
  • MVC y formularios web
  • SQL Server 2008
  • IIS 7

Mi pregunta es, cuando pasamos a MVC con VS 2010, ¿deberíamos usar Entity Framework (u otro ORM), un micro ORM (como Massive ) o simplemente SQL?

Todos los tutoriales que he leído sobre VS 2010 están orientados al uso de Entity Framework para las transacciones de datos, pero ¿eso estará disponible en el futuro previsible (más de 5 años)?

Si es importante, las aplicaciones de nuestros clientes pueden tener entre 10 y 1,000 usuarios activos.

guanome
fuente
¿Estás utilizando Linq-to-SQL actualmente?
Morgan Herlocker
Estamos usando SQL parametrizado
guanome
44
Evite usar SQL directamente en su desarrollo futuro. ORM o EF son casi imprescindibles. Dedíquese alguna vez a tener una estrategia para su capa de acceso a datos. Es una decisión crítica y no es una tarea trivial. Asegúrese de tener suficiente tiempo para que usted y el equipo lo aprendan. Se debe administrar la introducción de la nueva tecnología central al equipo. Elija la herramienta, elija el material, tenga algo de educación, ..., luego evalúe y decida.
NoChance
2
Bases de datos nuevas o existentes? Existe una gran diferencia entre construir una nueva base de datos teniendo en cuenta las convenciones de EF y tratar de adaptar EF encima de una base de datos existente que no se creó para ORM.
rmac
@rmac Era para una nueva base de datos.
guanome

Respuestas:

45

Recientemente cambié de usar consultas SQL en línea a usar EF y esto es lo que he encontrado:

Pros

  • Mucho más rápido para construir el DAL (¡me encanta no escribir las consultas SQL!)
  • Mucho más fácil de mantener
  • Ya no es necesario recordar analizar mi entrada antes de crear una instrucción sql en línea, lo que significa menos posibilidades de un ataque de inyección SQL (por supuesto, todavía es posible dependiendo de sus consultas, pero mucho menos probable)

Contras

  • No puede abarcar varias bases de datos ... al menos no fácilmente
  • Todas las entidades (tablas, vistas, etc.) necesitan una clave primaria
  • Si desea actualizar una sola columna en una tabla de más de 100 columnas requeridas (no en el diseño de mi tabla), debe desplegar las 100 columnas para realizar la actualización. O use un procedimiento almacenado.
  • He tenido problemas con algunos valores predeterminados definidos en el servidor SQL que no se incluyen en el modelo de entidad después de que se agrega un nuevo registro. Por lo general, esto es con valores calculados o valores que se agregan en un desencadenador INSERT
  • En ocasiones, las consultas SQL se escriben mal y su ejecución es lenta. Si tiene una consulta de ejecución lenta, ejecute un rastreo de SQL para ver qué está haciendo EF. Es posible que pueda volver a trabajar esa consulta como SP o Vista. Sin embargo, esto no sucede tan a menudo.
  • He tenido algunos problemas al intentar crear una asociación entre tablas que no tienen una clave externa definida en SQL Server. Por lo general, es porque estoy tratando de crear una 1:0-1relación donde EF quiere usar un1:0-*

Sin embargo, no soy un experto en EF, por lo que probablemente me perdí algunas cosas. Estos son solo los elementos que sé que he encontrado en el pasado al cambiar de SQL en línea a Entity Framework. Me alegro de haber hecho el cambio, pero ha habido momentos en los que realmente odio a EF debido a sus peculiaridades.

Rachel
fuente
77
+1 para una respuesta detallada y organizada. "Todas las entidades (tablas, vistas, etc.) necesitan una clave principal" parece una restricción razonable en lugar de una estafa.
NoChance
2
@EmmadKareem Es una buena restricción si tienes control sobre la base de datos, pero si estás trabajando con una base de datos de terceros o con vistas, puede ser un poco molesto
Rachel
1
Simplemente intente usar EF en una aplicación web N-Tier desconectada, actualizando entidades en una sesión y relaciones MM, ¡hmmmmm qué divertido!
Vidar
55
Las entidades @EmmadKareem realmente necesitan una clave primaria de un solo valor: el uso de claves compuestas es una pesadilla en EF. Esta es una restricción en lugar de una restricción razonable.
Kirk Broadhurst
1
Yo diría que la seguridad es otro problema. Muchos piensan que todo el acceso a la base de datos debe pasar por procedimientos almacenados con roles de base de datos asociados con procesos para determinar qué inicios de sesión pueden ejecutar qué procesos almacenados. Esto descarta EF / LINQ para crear consultas. He usado EF pero he encontrado clientes ( tos Microsoft) que tenían estos requisitos de seguridad
Mick
12

Entity Framework es una herramienta de productividad. A menos que tenga una buena razón para no hacerlo (por ejemplo, está en SQL 2000 o no tiene tiempo para aumentar la tecnología), utilice las mejores herramientas a su disposición.

Dicho esto, creo que el concepto de Entidades se traduce muy bien al Modelo del patrón MVC. Si bien tener una relación 1: 1 con Modelos y tablas es una mala práctica, pensar en términos de Entidades tiende a producir diseños limpios, código fácil de leer (especialmente con LINQ).

Entity Framework es activamente compatible con Microsoft. Nadie tiene una bola de cristal mágica para decir "el apoyo durará X años". No veo ninguna razón para creer que Entity morirá en los próximos 5 años.

P.Brian.Mackey
fuente
3
LinqToSql murió bastante rápido, por lo que realmente no hay razón para creer de una forma u otra si Entity Framework sobrevivirá. Vale la pena tener en cuenta el nuevo impulso de MS hacia Metro, en la medida en que estén considerando la revisión de muchas de sus ofertas.
ocodo
3
Slomojo, puede que tengas una definición diferente del resto del mundo de la palabra 'Dead'. Porque LinqToSql ya no se está desarrollando activamente. Aún podrá usarlo dentro de 10-20 años.
Boris Yankov
4

Otra posible solución es utilizar una biblioteca alternativa de Entity Framework que no sea la que se proporciona con VS. Existen algunas en la web.

El concepto de marco Entity / 3 layer, ha estado disponible por un tiempo, y ha trabajado con varias bibliotecas personalizadas, como muchos otros desarrolladores, antes de que Microsoft lanzara su propio marco "oficial".

Pros

Tenga los beneficios del marco de Entity (DAL), sin estar atascado con las bibliotecas constantes de Microsoft / cambios en el marco.

Agregar características a una biblioteca que tal vez no estén disponibles para la biblioteca oficial existente, como usar varias marcas de dtabase.

Contras

Tiene que soportar la biblioteca o las herramientas. Es muy común tener una herramienta de código de generador de entidades para generar las unidades.

umlcat
fuente
Esta respuesta me parece muy confusa. Solo hay un Entity Framework (con letras mayúsculas) que es el que produce Microsoft. ¿Te refieres a "usar otro mapeador relacional de objetos"? Entity Framework no es un término genérico, es el nombre del ORM de Microsoft.
NickG
Aunque existe un "Microsoft Entity Framework", el concepto de "Entity Framework" existe desde hace varios años.
umlcat
3

Debe tomar una decisión arquitectónica basada en el problema y la solución existente. Como con cualquier tecnología, hay ventajas y desventajas.

Personalmente, normalmente usaría el marco de la entidad para un nuevo desarrollo, pero no reescribiría el código existente que funciona. Luego obtienes la velocidad para el futuro despliegue, pero no tienes que invertir mucho tiempo convirtiendo el código. La desventaja de ese enfoque es que reduce la consistencia.

Tom Squires
fuente
3
+1 por recomendar no volver a escribir el código de trabajo.
NoChance
2

En su situación, definitivamente usaría Entity Framework, he encontrado que funciona bien con MVC.
Aquí hay algunas razones reales y sugerencias.

  • Es un placer usar Linq, y la ejecución retrasada también es extremadamente útil.
  • Puede generar sus modelos (sin embargo, cuando lo use con mvc, le recomendaría que use ver modelos junto con los modelos de datos, esto hace que la validación y el enlace del modelo sean mucho más fáciles, si toma ese enfoque, use automapper para asignar los cambios nuevamente en su modelo de datos).

Sin embargo, hay varias cosas que necesitará aprender sobre el uso de un ORM.

  • Qué hace el contexto por usted (seguimiento de la entidad)
  • Que un contexto debe usarse como una unidad de trabajo
  • Recuerde tener en cuenta la concurrencia, EF puede decirle cuándo su objeto está desactualizado, pero puede ser complicado si desea manejar la concurrencia correctamente en las solicitudes (ya que necesita mantener una marca de tiempo o algo así).

Cosas para considerar

  • Los disparadores y los ORM no funcionan juntos, en su lugar, use los eventos ORM.
  • Asegúrese de que todas sus mesas tengan claves de promary.

También recomendaría encarecidamente el primer enfoque de código, incluso si tiene una base de datos existente.

  • Las convenciones significan que no necesita volver a generar asignaciones o clases cuando cambia la base de datos.
  • Es más fácil colocar validación y otra lógica en los modelos.
  • Puede usar el generador de código para ayudar a crearlos si tiene una gran base de datos existente.
Daniel Little
fuente