El uso de procedimientos almacenados es unidireccional y se ha utilizado ampliamente durante muchos años.
Una forma más moderna de interactuar con las bases de datos de SQL Server desde C # (o cualquier lenguaje .NET) es usar Entity Framework. La ventaja de Entity Framework es que proporciona un mayor nivel de abstracción.
Para citar de Microsoft ( https://msdn.microsoft.com/en-us/data/jj590134 ):
ADO.NET Entity Framework permite a los desarrolladores crear aplicaciones de acceso a datos mediante la programación contra un modelo de aplicación conceptual en lugar de programar directamente contra un esquema de almacenamiento relacional. El objetivo es disminuir la cantidad de código y mantenimiento necesarios para las aplicaciones orientadas a datos. Las aplicaciones de Entity Framework brindan los siguientes beneficios:
- Las aplicaciones pueden funcionar en términos de un modelo conceptual más centrado en la aplicación, incluidos los tipos con herencia, miembros complejos y relaciones.
- Las aplicaciones están libres de dependencias codificadas en un motor de datos o esquema de almacenamiento en particular.
- Las asignaciones entre el modelo conceptual y el esquema específico de almacenamiento pueden cambiar sin cambiar el código de la aplicación.
- Los desarrolladores pueden trabajar con un modelo de objeto de aplicación consistente que se pueda asignar a varios esquemas de almacenamiento, posiblemente implementados en diferentes sistemas de administración de bases de datos.
- Se pueden asignar varios modelos conceptuales a un único esquema de almacenamiento.
- El soporte de consulta integrada en el lenguaje (LINQ) proporciona validación de sintaxis en tiempo de compilación para consultas contra un modelo conceptual.
El uso de un ORM vs Procedimientos almacenados implica compensaciones, particularmente en términos de seguridad y dónde reside la lógica.
El enfoque "clásico" para el desarrollo con SQL Server es hacer que la lógica de la aplicación resida en procedimientos almacenados y programas que solo tengan derechos de seguridad para ejecutar procedimientos almacenados, no actualizar tablas directamente. El concepto aquí es que los procedimientos almacenados son la capa de lógica de negocios para las aplicaciones. Si bien la teoría es sólida, ha tendido a caer en desgracia por varias razones, siendo reemplazada por la implementación de la lógica de negocios en un lenguaje de programación como C # o VB. Las buenas aplicaciones aún se implementan con un enfoque escalonado, incluida la separación de preocupaciones, etc., pero es más probable que sigan un patrón como MVC.
Una desventaja de implementar la lógica en el ORM en lugar de en la base de datos es la facilidad de depuración y prueba de las reglas de integridad de datos por parte de los responsables de la base de datos (DA o DBA). Tome el ejemplo clásico de transferir dinero de su cuenta corriente a su cuenta de ahorros, es importante que esto se haga como una unidad atómica de trabajo, en otras palabras, intercalado en una transacción. Si este tipo de transferencia solo se puede realizar a través de un procedimiento almacenado, es relativamente fácil para el DA y los auditores QA el procedimiento almacenado.
Si, por otro lado, esto se hace a través de un ORM como Entity Framework y en la producción se descubre que en raras ocasiones se extrae dinero de la verificación pero no se deposita en la depuración de ahorros puede ser mucho más complejo, particularmente si múltiples programas están potencialmente involucrados. Es muy probable que este sea un caso extremo, que tal vez implique problemas de hardware peculiares que deben ocurrir en una secuencia particular, etc. ¿Cómo se prueba esto?