entity-framework - sure - entity framework stored procedure multiple result sets
Procedimientos almacenados de Entity Framework vs SQL generado (5)
Creo que siempre usando SP''s es algo viejo. Solía codificar de esa manera, y ahora hago todo lo que puedo en el código generado por EF ... y cuando tengo un problema de rendimiento u otra necesidad especial, luego vuelvo a agregar un SP estratégico para resolver un problema en particular ... no tiene que ser ni - o usar ambos.
Todas mis operaciones básicas de CRUD son códigos generados directamente por EF: mis aplicaciones web solían tener 100 o más SP, ahora una típica tendrá una docena de SP y todo lo demás se hace en mi código C # ... y mi productividad se ha ido AUMENTE eliminando esos 95% de los procesos almacenados en CRUD.
He utilizado el marco de la entidad en un par de proyectos. En cada proyecto, he usado procedimientos almacenados asignados a las entidades debido a los beneficios bien conocidos de los procedimientos almacenados: seguridad, capacidad de mantenimiento, etc. Sin embargo, el 99% de los procedimientos almacenados son procedimientos almacenados básicos de CRUD. Esto parece que niega una de las características principales de ahorro de tiempo de Entity Framework: la generación de SQL.
He leído algunos de los argumentos relacionados con los procedimientos almacenados en comparación con el SQL generado desde Entity Framework. Si bien el uso de SP de CRUD es mejor para la seguridad, y el SQL generado por EF a menudo es más complejo de lo necesario, ¿realmente compra algo en términos de rendimiento o mantenimiento para usar los SP?
Esto es lo que creo:
- La mayoría de las veces, la modificación de un SP requiere la actualización del modelo de datos de todos modos. Por lo tanto, no está comprando mucho en términos de mantenibilidad.
- Para las aplicaciones web, la conexión a la base de datos utiliza un único ID de usuario específico para la aplicación. Por lo tanto, los usuarios ni siquiera tienen acceso directo a la base de datos. Eso reduce el beneficio de seguridad.
- Para una aplicación pequeña, el rendimiento ligeramente menor del uso de SQL generado probablemente no sea un gran problema. Para aplicaciones críticas de alto volumen y rendimiento, ¿EF sería una opción inteligente? Además, ¿son realmente malas las declaraciones de inserción / actualización / eliminación generadas por EF?
- El envío de cada atributo a un procedimiento almacenado tiene sus propias penalizaciones de rendimiento, mientras que el código generado por EF solo envía los atributos que realmente se modificaron. Al realizar actualizaciones en tablas grandes, el mayor tráfico de red y la sobrecarga de actualizar todos los atributos probablemente anulan el beneficio de rendimiento de los procedimientos almacenados.
Dicho esto, mis preguntas específicas son:
¿Mis creencias en la lista de arriba son correctas? ¿La idea de usar siempre los SP es algo que es "la vieja escuela" ahora que los ORM están ganando popularidad? Según su experiencia, ¿cuál es la mejor manera de ir con los EF de mapeo EF para todas las inserciones / actualizaciones / eliminaciones, o usar el SQL generado por EF para las operaciones CRUD y solo usar los SP para cosas más complejas?
En mi opinión, siempre y cuando su aplicación / base de datos no sufra problemas de rendimiento y la mayoría esté utilizando la base de datos para CRUD y acceda a ella con un solo usuario de base de datos, es mejor usar el SQL generado. Es más rápido de desarrollar, más fácil de mantener y los pocos beneficios de seguridad o más privacidad no valen la pena (si los datos no son tan confidenciales). También el uso del acceso a la base de datos basado en modelos o LINQ deshabilitó la amenaza de las inyecciones de SQL.
Estoy totalmente de acuerdo con EJ, pero hay un par de otras opciones. Realmente se reduce a los requisitos para el sistema en particular:
- ¿Necesitas obtener la aplicación desarrollada RÁPIDO? - Luego usa el framework de entidades y su SQL automático.
- ¿Necesita seguridad de grano fino y sólida? - Entrar en procedimientos almacenados.
- ¿Lo necesitas para correr lo más rápido posible? - ¡Probablemente estés viendo algún medio feliz!
Sí, tus creencias son absolutamente correctas. El uso de procedimientos almacenados para la manipulación de datos tiene significado principalmente si:
- La base de datos sigue reglas de seguridad estrictas donde los cambios de datos solo se permiten a través de procedimientos almacenados
- Está utilizando vistas o consultas personalizadas para asignar sus entidades y necesita una lógica avanzada en el procedimiento almacenado para reenviar los datos
- Tiene alguna lógica avanzada (relacionada con los datos) en el procedimiento por cualquier otra razón
El uso de procedimientos para CUD pura donde no se apliquen los casos mencionados es redundante y no proporciona ningún aumento de rendimiento medible, excepto en un solo escenario
- Utilizará procedimientos almacenados para modificaciones por lotes / a granel
¡EF no tiene funcionalidad de lotes / lotes, por lo que cambiar 1000 registros da como resultado 1000 actualizaciones cada una ejecutada con base de datos de ida y vuelta separada! Pero tales procedimientos no pueden asignarse a las entidades de todos modos y deben ejecutarse por separado a través de la importación de funciones (si es posible) o directamente como ExecuteStoreCommand
o ADO.NET anterior (por ejemplo, si desea usar un parámetro con valores de tabla).
Toda la historia diferente puede ser R en CRUD, donde el procedimiento almacenado puede obtener un aumento significativo del rendimiento para leer datos con sus propias consultas optimizadas.
Si el rendimiento es su principal preocupación, entonces debería tomar una de sus aplicaciones existentes que utiliza EF con SP, deshabilitar los SP y comparar la nueva versión. Esa es la única manera de obtener una respuesta perfectamente aplicable a su situación. Puede encontrar que EF no importa lo que haga, no es lo suficientemente rápido para sus necesidades de rendimiento en comparación con el código personalizado, pero fuera de los sitios de gran volumen, creo que EF 4.1 es bastante razonable.
Desde mi punto de vista, EF es un gran aumento de la productividad del desarrollador. Pierde un poco de eso si está escribiendo SP para operaciones CRUD simples, y para Insertar / Actualizar / Eliminar en particular realmente no veo que gane mucho en rendimiento porque esas operaciones son tan sencillas para generar SQL para. Definitivamente, hay algunos casos Select en los que EF no hará lo óptimo y puede obtener mayores aumentos de rendimiento al escribir un SP (las consultas jerárquicas que usan CONECTAR POR en Oracle vienen a la mente como ejemplo).
La mejor manera de lidiar con ese tipo de cosas es escribir su aplicación y dejar que EF genere el SQL. Benchmark de ello. Encuentre áreas donde haya problemas de rendimiento y escriba SP para ellos. Eliminar casi nunca va a ser uno de los casos que necesita hacer esto.
Como mencionó, el beneficio de seguridad aquí se ve algo reducido porque debería tener EF en un nivel de Aplicación que tenga su propia cuenta para la aplicación, de modo que pueda restringir lo que hace. Los SP te dan un poco más de control, pero en el uso típico no creo que importe.
Es una pregunta interesante que no tiene una respuesta realmente correcta o incorrecta. Utilizo EF principalmente para no tener que escribir CRUD SP genéricos y puedo dedicar mi tiempo a trabajar en los casos más complejos, así que para mí diría que debería escribir menos de ellos. :)