En esta oportunidad creare una demo de Ncapas haciendo uso de EntityFrameWork como en el primer Blog la capa de acceso tambien sera generica esto para evitar codigo repetido entre otras cosas.
ACCESO A DATOS
La estructura Nlayer es la siguiente
En esta primera parte realizaremos el Acceso a datos usando Entity FrameWork
ACCESO A DATOS
Las nuevas herramentas que van proveyendo las empresas de desarrollo para mapear una base de datos se ha vuelto comun en estos tiempos a ello lo denominan ORM's (Object Relational Mapping). Entity Framewok es una herramienta ORM el cual nos permite mapear una DB otros ejemplos son JPA e Hibernet dentro del mundo de JAVA ya ire publicando un proy Nlayer en java tambien.
Seleccionamos un proyecto vacio y elegimos el check de MVC, elegimos vacio porque por lo menos por mi los demas generan basura y despues hay q limpiarlos.
Despues veremos de estructurar nuestro proy de MVC primero comenzaremos creado la estructura de las capas empezando con la de Acceso a datos.
Agregamos un proyecto de Classlibrary
Agregamos como un nuevo item de tipo Ado.Net EntityModel
Seleccionamos la Base de Datos
Seleccionamos la version de EF
Seleccionamos los objectos de la DB a usar en este caso las tablas no se olvide de desseleccionar la taba de diagrama la cual no necesitaremos y finializamos
Con esto crearemos un archivo .edmx el cual contiene un conjunto de archivos entre los caules esta en este caso ColegioModel.tt este archivo nos interesa ya que este contiene las entidades mapeadas y segun nuestro modelo debe star presente en todas las capas
Para que todas las entidades esten en todos los proyecto lo que debemos hacer es desvincular este archivo del proyecto y asignarlo a otro proyecto en nuestro caso el prory Entity
y quedara de la siguiente manera
Dos cosas importantes para que no se pierdan los vinculos de los archivos.
1. Cambiar la direccion de del archivo .edmx editanto el archivo ColegioModel.tt
2.- Cambiar el espacio de nombre al que esta asignado ColegioModel.tt en la propiedad del archivo ColegioModel.Context.tt
Realizamos el Build de los dos proyectos verifcando que no lancen excepciones.
No olvidarce de referenciar el proyecto Entidades a todos los demas proyectos
Continuando crearemos la estructura para tener una clase generica de operaciones CRUD de todas las entidades.
Crearemos nuestra primera interface
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace DAL.Generic { public interface IGenericDataRepository<T> where T : class { IList<T> GetAll(); T Find(Expression<Func<T, bool>> where); void Add(params T[] items); void Update(params T[] items); void Remove(params T[] items); } } |
Implementando en la clase generica
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using Entity; namespace DAL.Generic { public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class { public virtual IList<T> GetAll() { List<T> list; using (var context = new ColegioEntities()) { IQueryable<T> dbQuery = context.Set<T>(); list = dbQuery.ToList<T>(); } return list; } public virtual T Find(Expression<Func<T, bool>> where) { T item = null; using (var context = new ColegioEntities()) { IQueryable<T> dbQuery = context.Set<T>(); item = dbQuery.Where(where).ToList().FirstOrDefault<T>(); } return item; } public void Add(params T[] items) { using (var context = new ColegioEntities()) { foreach (T item in items) { context.Entry(item).State = EntityState.Added; } context.SaveChanges(); } } public void Update(params T[] items) { using (var context = new ColegioEntities()) { foreach (T item in items) { context.Entry(item).State = EntityState.Modified; } context.SaveChanges(); } } public void Remove(params T[] items) { using (var context = new ColegioEntities()) { foreach (T item in items) { context.Entry(item).State = EntityState.Deleted; } context.SaveChanges(); } } } } |
Esta clase generica tambien la podemos extender dentro la implemetacion de la clase concreta (repositorio) como ejemplo creamos un SP para una insercion de datos(solo ejm)
Ejm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DAL.Generic; using Entity; namespace DAL.Dao { public interface IRolRepository: IGenericDataRepository<Rol> { } public class RolRepository : GenericDataRepository<Rol>, IRolRepository { public void InsertBySq(string nombre) { using (var context = new ColegioEntities()) { context.sp_insert_rol(nombre); context.SaveChanges(); } } } } |
Esta clase contrendra todas las operaciones CRUD que requerimos y adicionamente vemos un ejm tambien de llamada a un Store Procedure
Con esto terminamos la capa de acceso prox Cap agregare la capa de negocios la cual tb la la volveremos de tipo generica cosa que nos facilite tener que evitar de escribir mas codigo.














No hay comentarios:
Publicar un comentario