Vous êtes sur la page 1sur 16

Mini Proyecto de ejemplo usando Entity Framework en una Arquitectura nLayer Parte 1

Asesor e Instructor: Nelson Lpez Hidalgo Email: nelson.hidalgo@misena.edu.co

En este ejemplo, vamos a trabajar en el desarrollo de una mini aplicacin que administra los casos de uso de n empresas al menos desarrollar un poquito de funcionalidad de la aplicacin para ilustrar los conceptos expuestos. La Base de Datos El primer paso es crear una base de datos para persistir la informacin de los proyectos. Vamos a crear una base de datos utilizando SQLServer 2005/2008. Esta base de datos se llamar UseCases. El diagrama inicial de la base de datos es el siguiente.

En este caso, vamos a decir que una empresa puede tener varios proyectos, y que cada proyecto tiene muchos casos de uso. Cada caso de uso tiene un historial de acciones que se graba cada vez que se realiza un cambio en el caso de uso ( esto suponiendo una base de datos completa, en donde se guardan los diferentes flujos del caso de uso,
1

sus actores, etc). Por ltimo, cada registro del historial de cambios tiene un usuario asociado que es precisamente el que realiz el cambio. Desarrollando la Solucin Para el desarrollo de la solucin vamos a utilizar Visual Studio 2010. El primer paso es crear una solucin vaca para ir agregando los diversos proyectos que vamos a ir requiriendo en el desarrollo de la aplicacin. Para crear una solucin vaca seleccionamos: new project > visual studiosolutions >BlankSolution.

Creando la capa de Acceso a Datos Una vez que tenemos la solucin, vamos a crear la CAPA DE ACCESO A DATOS (que por lo general es el primer bloque que se crea cuando se realiza un proyecto con arquitectura n-layer). Para agregar el proyecto, seleccionamos con el botn derecho del mouse la solucin recin creada y seleccionamos del men contextual agregar nuevo proyecto.

Cuando aparece la opcin de seleccionar el tipo de proyecto deseado seleccionamos la opcin de classlibrary en el tipo de proyecto Windows bajo C#. Al proyecto le vamos a poner de nombre CapaDeAccesoADatos.

Despus de creada la capa de acceso a datos al menos el proyecto procedemos a agregar el modelo del entitiyframework. Debemos recordar que el EF sustituye a la capa de acceso a datos. Por esta razn en este componente de acceso a datos, solamente vamos a tener el modelo generado por el EF. Para crear un modelo de entidades le damos clic y botn derecho al proyecto recin creado y seleccionamos agregar nuevo tem.

En el dilogo de seleccionar tem escogemos la opcin ADO.NET EntityModel. Le vamos a llamar UseCasesModel.

Cuando inicia el wizard del EF en el primer paso seleccionamos la opcin generar desde base de datos. Seguidamente creamos una nueva conexin a la base de datos que recin acabamos de crear; le decimos adems al wizard que agregue el string de conexin al archivo app.config con el nombre UseCasesEntities.

Seleccionamos Next y procedemos a seleccionar las tablas que vamos a utilizar en nuestro modelo. En este caso, vamos a mapear en el modelo, todas las tablas creadas en el diseo de la base de datos hecha en SQLServer.

El modelo generado es el siguiente

En el paso que estamos, la solucin debera lucir de la siguiente manera:

En este momento solo tenemos una librera dll que va a convertirse en mi capa de acceso a datos. En el prximo post, vamos a desarrollar la capa de lgica de negocios.

El Entity Framework en una Arquitectura n-layer Parte 2 La CAPA DE NEGOCIOSes la capa en la cual vamos a crear los mtodos unitarios que llevan a cabo las tareas correspondientes de cada una de las entidades. Estas tareas incluyen desde las operaciones CRUD create, retrieve, update, delete hasta procesos de negocios ms elaborados. Para crear esta capa de negocios, vamos a crear una librera utilizando los mismos pasos que hicimos en el post anterior, pero vamos a llamar la libreria como LogicaDeNegocios.

Al igual que hicimos en la librera de la capa de acceso a datos, vamos a eliminar la clase que es creada por defecto cuando creamos el componente. La solucin ahora debera lucir as:

Seguidamente vamos a crear las clases de lgica de negocios para poder llevar a cabo operaciones que se requieran para cada entidad. En este caso, vamos a crear la clase de lgica de negocios para la entidad Usuario. Para crear esta clase, le damos click derecho sobre el proyecto de lgica de negocios y seleccionamos agregar nuevo tem > Agregar Clase. En el dilogo de agregar clase escribimos UsuarioBL como nombre de la clase, para poder identificar la clase de lgica de negocio para el usuario en las capas de presentacin que vayamos a crear o incluso en la capa de servicios si deseamos crear una para permitir que nuestra funcionalidad de negocios se pueda acceder a travs de servicios.

El siguiente paso es agregar una referencia a la capa de acceso a datos para as poder tener visibilidad de las operaciones existentes dentro del modelo de entidades creado en esa librera. Para lograr esto, le damos click derecho al proyecto de lgica de negocios y seleccionamos la opcin agregar referencia del menu contextual. En el dialogo de agregar referencias seleccionamos la cejilla de proyectos y escogemos el proyecto para capa de acceso a datos.

La referencia debe poder verse en la carpeta de referencias del proyecto como se muestra a continuacin.

Una vez agregada la referencia, procedemos a agregar el uso de la librera en la clase recin creada. Esto se logra a travs de la instruccin using, seguidamente creamos una propiedad automtica para tener acceso al modelo de entitdades que creamos anteriormente en la capa de acceso a datos.

Como se puede ver en la figura anterior, es requerido agregar la librera System.Data.Entities para poder hacer uso de las entidades presentes en la capa de acceso a datos. En post posteriores vamos a analizar con un poco ms de profundidad el entityframework y estos detalles. Para agregar esta librera seguimos el mismo proceso que llevamos a cabo anteriormente para agregar la referencia a la capa de acceso a datos, solo que esta vez vamos a buscar la librera en la cejilla de .NET.

Una vez agregada esta referencia, la clase actual para manejar la lgica de de negocios del usuario ya compila.

Un aspecto a destacar, es que agregamos una propiedad dinmica para tener acceso al modelo de entidades que acabamos de agregar desde la capa de acceso a datos, y adems instanciamos el modelo de entidades generado desde el constructor de la clase. Este comportamiento puede no ser el deseado ya que puede producirnos trabajo extra a la hora de agregar relaciones que se obtienen desde otras clases de lgica de negocios por que cada clase va a venir de diferentes instancias del modelo, es decir desde diferentes contextos. En el post de como extender y mejorar el EF en una arquitectura n-layer vamos a ver cules pueden ser las posibles soluciones para manejar estos casos.

10

Seguidamente procedemos a crear los mtodos principales de CRUD en la lgica de negocios. Primeramente vamos a crear el mtodo para agregar un usuario.Este mtodo recibe una entidad del tipo Usuario, y la agrega al contexto instanciado utilizando el mtodo generado AddToUsuario. Finalmente, procedemos a persistir los cambios en la base de datos utilizando el mtodoSaveChanges.

En muchas ocasiones surge la pregunta, por qu recibir un usuario y no los campos para agregar a la entidad? La respuesta est relacionada con la adaptabilidad al cambio de parte de la aplicacin. Puede ser que en un futuro se requiera quitar o agregar campos a la entidad usuario; si estamos utilizando los campos en lugar de una entidad, vamos a tener que modificar todos los mtodos donde interactuamos con la entidad para modificar, actualizar, seleccionar, etc. Sin embargo, si utilizamos una entidad, los puntos que varan son la entidad, el UI en donde construimos la entidad y la capa de acceso a datos donde agregamos los campos al repositorios si estamos usando el EF, no se requieren cambios en la capa de acceso a datos ya que el EF actualiza los mtodos desde el modelo con lo que nuestra aplicacin es ms fcil para modificar. Seguidamente procedemos a crear los mtodos necesarios para obtener todos los usuarios que existen en la base de datos, y el mtodo que me retorna un usuario en especfico. Inicialmente agregamos la referencia a la librera System.Linq, esto para tener acceso a los mtodos de extensin usingSystem.Collections.Generic; usingCapaDeAccesoADatos; usingSystem.Linq;
11

Seguidamente creamos los mtodos mencionados anteriormente. En este caso vamos a utilizar la sintaxis del EF para acceder a los datos. En artculos posteriores vamos a utilizar LinqToEntities para llevar a cabo las mismas tareas.

publicList<Usuario>ObtenerUsuarios( ) { varusuarios = ModeloEntidades.Usuario; returnusuarios.ToList( ); } publicUsuario ObtenerUsuario( intid ) { varusuario = ModeloEntidades.Usuario.Where(u =>u.Id == id).FirstOrDefault( ); returnusuario; } Con estos mtodos ya tenemos un conjunto de funcionalidad suficiente para poder trabajar con nuestra capa de UI. Digo suficiente porque por supuesto faltan los mtodos para actualizar y borrar usuarios, adems los correspondientes mtodos para asociar los usuarios a las entidades correspondientes. Estos mtodos debern ser realizados por los estudiantes. La solucin de la aplicacin debe de lucir de la siguiente manera:

12

El Entity Framework en una Arquitectura n-layer Parte 3 Ya habiendo creados las capa para la lgica de negocios y la capa de acceso a datos utilizando el entityframework. En esta parte, vamos a crear la capa de presentacin de la aplicacin de ejemplo utilizando ASP.NET. El primer paso es crear un nuevo proyecto dentro de la solucin en la cual hemos venido trabajando. El proyecto a crear es una aplicacin ASP.NET (C#).

Le ponemos de nombre mini-proyecto

Seguidamente, creamos un formulario, Para agregar un usuario, un usuario tiene bsicamente los siguientes campos:

13

Id Nombre Apellido1 Apellido2 Email Activo.

De estos campos, el Id es autogenerado y el campo de activo es para borrado lgico por lo que en la insercin por defecto, el campo se guarda con un valor de Y. La pantalla que vamos a crear por lo tanto deber lucir como se ve en la siguiente figura:

Seguidamente vamos a agregar el cdigo necesario para agregar la entidad ingresada en el formulario, pero antes de esto, debemos agregar una referencia a la capa de lgica de negocios y a la capa de acceso a datos. A esta ltima la tenemos que agregar por que las entidades son el medio de transporte entre las capas, y como no tenemos una capa de entidades separada, entonces tenemos que agregarla desde la capa de acceso a datos. Adems se debe de agregar una referencia a la librera System.Data.Entity. El cdigo lucir de la siguiente forma: usingSystem.Windows; usingCapaDeAccesoADatos; usingLogicaDeNegocios; namespaceMiniProyecto
14

{ publicpartialclassDetalleUsuario { publicDetalleUsuario( ) { InitializeComponent( ); } privatevoidbtnOk_Click( objectsender, RoutedEventArgse ) { Usuario usuario = new Usuario( ); usuario.Nombre = txtNombre.Text; usuario.Apellido1 = txtApellido1.Text; usuario.Apellido2 = txtApellido2.Text; usuario.Email = txtEmail.Text; usuario.Activo = "Y"; UsuarioBL usuarioBL = new UsuarioBL( ); usuarioBL.AgregarUsuario(usuario); } } }

Como podemos ver, lo nico que hacemos es crear una entidad, crear una instancia de la clase usuario de la lgica de negocios e invocar el mtodo agregar usuario pasando de parmetro la entidad del usuario recin creada. Este cdigo, adems de simple, es sencillo de mantener y permite que todos los desarrolladores que estn trabajando en el proyecto, tengan un estilo similar para programar, lo que facilita el hecho de que una persona no est disponible para modificar o agregar funcionalidad a una pantalla. Si ejecutamos la pantalla anterior, veremos la siguiente pantalla en ejecucin:

Si ingresamos datos, y le damos ok, vamos a recibir el siguiente error de parte del entityframework:
15

Thespecifiednamedconnectioniseithernotfound in theconfiguration, notintendedto be usedwiththeEntityClientprovider, ornotvalid. Esto quiere decir que el entityframework no est encontrando el conectionstring para pegarse a la base de datos. Este connectionstring se encuentra en el archivo app.config de la librera de acceso a datos; pero en este caso, como no tenemos configurada la salida de todos los proyectos al mismo directorio algo de lo que vamos a ir conversando en post posteriores entonces la aplicacin no lo logra localizar. Para solucionar este problema de forma rpida y temporal - debemos simplemente agregar un archivo app.config al proyecto del cliente WPF y copiar el connectionstring desde el app.config de la capa de acceso a datos. El primer paso es agregar el archivo config al cliente de WPF.

Seguidamente copiamos desde el archivo app.config de la capa de acceso a datos, el string de conexin al archivo recin creado <connectionStrings> <addname="UseCasesEntities" connectionString="metadata=res://*/UseCasesModel.csdl|res://*/UseCasesModel.ss dl|res://*/UseCasesModel.msl;provider=System.Data.SqlClient;provider connectionstring=&quot;DataSource=diego-pc\sqlserver2008;Initial Catalog=UseCases;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> </connectionStrings> Seguidamente, procedemos a ejecutar la aplicacin y a insertar los usuarios que vayamos a necesitar.
Asesor e Instructor: Nelson Lpez Hidalgo Email: nelson.hidalgo@misena.edu.co

16

Vous aimerez peut-être aussi