*Para este articulo es necesario el conocimiento previo del desarrollador en Entity Framework 4.1
El ORM de Entity Framework 4.1 se lanzo con una caracteristica llamada Code-First, donde tenemos un DbContext Api el cual nos permite mediante POCO (Plain Object CLR Object) es decir clases planas, mapear nuestras entidades con las tablas de SQL Server y asi hacer mas transparente nuestros modelos de la capa de acceso a datos, junto con esta y algunas otras caracteristicas trajo algunos inconvenientes para las personas que estaban acostumbradas al diseƱador de este ORM, ya que en versiones anteriores el diseƱador permitia mapear funciones y/o procedimientos almacenados, aunque estas tenian restricciones.
En este articulo vamos a ver como ejecutar procedimientos almacenados desde el DbContext para traer datos que coincidan con un modelo existente (tipo estatico) y tambien como traer datos dinamicos.
Primero vamos a crear una solucion de Visual Studio y en este caso usare un proyecto de ASP.Net MVC 2 para el ejemplo.
Una vez hecho esto descargaremos Entity Framework 4.2, en mi caso usare Nuget (el cual es una herramienta open source que permite administrar las librerias de terceros).
Lo siguente es crear la base de datos y la tabla que usaremos de ejemplo, la cual se muestra a continuacion.

Una vez hecho esto creamos el contexto de acceso a datos.

Una vez realizado esto crearemos una clase que nos servira como proxy, es decir como intermediario entre nuestros datos y el contexto de Entity Framework, asi que creamos una clase estatica que la nombraremos como DatabaseFunctionProxy.cs, esta clase tiene 2 metodos uno que nos permite traer datos de tipo estatico y uno de con tipos dinamicos.
Tipos estaticos usando Generics

Tipos dinamicos usando ExpandoObject

Ya que tenemos nuestro proxy debemos crear una clase que contendra las llamadas a estos procedimientos almacenados, en este caso la nombraremos DatabaseFunctions.cs

En la base de datos crearemos un procedimiento almacenado con el nombre getStudents

Ya que hicimos todo lo anterior llego el momento de consumir nuestros datos de una manera muy facil mediante procedimientos almacenados.
A continuacion veremos como traer datos de manera 'tipada'

Y ahora veremos de manera dinamica

Como vemos, con estas extensiones podemos hacer mas poderoso el ORM de Microsoft, para obtener datos a traves de procedimientos almacenados, a continuacion listo algunos de los usos que le he dado.
- Traer datos dinamicos, cuando el procedimiento almacenado traiga diferentes resulsets
- Traer datos de tipo estatico, cuando el procedimiento almacenado traiga datos que no coincidan con los modelos que estan mapeados con las tablas, es decir cuando estos procedimientos almacenados hagan join's, union's, etc..
- Traer datos dinamicos, cuando el procedimiento almacenado triga datos que no coincidan con los modelos que estan mapeados con las tablas.
El ejemplo para descarga aqui