Acceso a Datos con ADO.Net Entity Framework PDF

Title Acceso a Datos con ADO.Net Entity Framework
Author claudio valdes
Course Taller de programación III
Institution Universidad Tecnológica de Chile
Pages 9
File Size 305.2 KB
File Type PDF
Total Downloads 27
Total Views 145

Summary

Realizaremos la conexión y acceso a los datos de la Base de Datos Empresas, mediante las clases de acceso a
datos provistas en el espacio de nombre System.Data y System.Data.SqlClient. Es necesario crear la fuente
de datos con la que trabajaremos, para posteriormente programar el acceso ...


Description

Acceso a Datos con ADO.Net Entity Framework Cuando se analiza la cantidad de código que el desarrollador de aplicaciones medio debe escribir para atacar el desajuste o “vacío” entre las diferentes representaciones de datos (por ejemplo, objetos y almacenes relacionales), queda claro que hay posibilidades de mejorar. De hecho, hay muchos escenarios donde un framework adecuado puede potenciar a un desarrollador de aplicaciones para que se centre en las necesidades de de la aplicación y no en las complejidades relacionadas con combinar diferentes representaciones de datos. Una de las metas principales de la nueva versión de ADO.NET es elevar el nivel de abstracción de la programación contra fuentes de datos a través de la eliminación del "vacío" existente entre los modelos de datos y los lenguajes de programación. Y ¿Cómo es posible esto? A través de dos innovaciones claves de la plataforma: LINQ y ADO.NET Entity Framework. Precisamente éste último (Entity Framework) es un nuevo componente que aparece en la familia de tecnologías ADO.NET, que habilitará acceso a datos mediante LINQ utilizando LINQ To Entities. Para resumir las características de este Entity Framework, sin duda se deben destacar los siguientes puntos: • Se trata de un Framework que permite manipular y acceder a los datos como clases .NET. • Permite realizar un modelado de datos a nivel conceptual, es decir, habilita la separación de las aplicaciones y los esquemas de BD. • Permite una mejor interacción de los datos con el entorno .NET: Se interactúa con objetos, frente a hacerlo con filas y columnas. • Proporciona una serie de servicios en tiempo de ejecución y en tiempo de diseño que permite a los desarrolladores describir los datos de la aplicación e interactuar con ellos a un nivel de abstracción conceptual claramente alineado con el concepto de implementación de aplicaciones de negocio, y que además ayuda a aislar la aplicación respecto a los esquemas de base de datos (BD) sobre los que se ha definido. • Se apoya en LINQ para definir las consultas a objetos del esquema EDM (Entity Data Model). • Supone una capa más, pero independiza las aplicaciones del esquema de BD subyacente, independientemente de la tecnología de BD que se esté utilizando

Arquitectura de ADO.Net Entity Framework La mencionada independencia con el esquema y la tecnología de Base de Datos, se logra básicamente en una arquitectura dividida en dos partes diferenciadas, Modelo de Datos y Modelo Conceptual (EDM), en la que el paso de una parte a otra se realiza a través del correspondiente mapeo. Para realizar este mapeo se utilizan proveedores .NET que permiten interactuar con los datos en cada uno de las partes. La idea es que el provider .NET de la capa de datos se encarga de traducir las operaciones de datos realizadas en la capa conceptual a un lenguaje entendible por la BD (lógicamente T-SQL). Por su parte, el proveedor .NET (EntitySQL) de la capa conceptual traduce las consultas LINQ realizadas en las aplicaciones a las correspondientes instrucciones que interactúen con el modelo conceptual definido mediante el proceso de mapeo. Escencialmente el ADO.Net Entity Framework consiste en una serie de capas que abstraen el esquema relacional de una base de datos y presenta un modelo conceptual. El siguiente diagrama muestra y luego se describen los componentes involucrados en el ADO.Net Entity Framework: Fuente de Datos (Data Source) Corresponde al almacén de datos físicos, que puede ser una ó más bases de datos. Proveedores de Datos (Data Providers) Los datos se acceden mediante un proveedor de datos ADO.Net. En estos momentos se encuentran disponibles los proveedores para SQL Server (instalado por defecto) y Oracle (disponible para su descarga). Modelo de Entidades de Datos (Entity Data Model - EDM) Corresponde al modelo de entidades de datos y se compone de 3 parte: • Lenguaje de Definición del Esquema Conceptual (CSDL): Declara y define las entidades, asociaciones y herencia. Las clases de entidad se generan a partir de este esquema. • Lenguaje de Definición del Esquema del Almacén (SSDL): Metadatos que describen el contenedor del almacenamiento (base de datos) que persiste los datos. • Lenguaje de Especificación de Mapeo (MSL): Mapa de las entidades en el CSDL a las tablas descritas en el SSDL.

Entidad Cliente (EntityClient) Es un proveedor administrado por ADO.Net que permite el acceso a los datos descritos en el EDM. Es similar a un SQLClient u OracleClient. Provee de un conjunto de componentes como EntityCommand, EntityConnection y EntityTransaction. Servicios de Objetos (Object Services) Este componente permite consultar, insertar, actualizar y eliminar datos, expresados como objetos CLR fuertemente tipados que son instancias de los tipos de entidades. El servicio de objetos es compatible con consultas Entity SQL y LINQ to Entities. Entity SQL (ESQL) Es un derivado de Transact-SQL, diseñado para consultar y manipular entidades definidas en el Modelo de Datos de la entidad. Es compatible con las herencias y las asociaciones. Tanto los componentes de Object Services como los Entity Client, pueden ejecutar instrucciones ESQL. LINQ to Entities Se trata de un lenguaje de consulta fuertemente tipada, para consultas contra entidades definidas en el Modelo de Datos de la entidad. Definiendo el Modelo de Entidades de Datos EDM El primer paso para trabajar con ADO.NET Entity Framework (EF) pasa por crear un modelo de entidades a partir de un cierto esquema de BD. Esto se logra añadiendo un ADO.Net Entity Data Model a nuestro proyecto. Idealmente un EDM debe ser creado en una Biblioteca de Clases (aunque no es restrictivo), ya que este modelo de entidades pasará a conformar la Capa Lógica de Acceso a Datos - DALC, como hemos de inferir por la descripción de cada uno de los componentes que formar el ADO.Net EF. Al momento de agregar el EDM se nos presentará un asistente de 3 pasos en el cual debemos definir algunos elementos y componentes importantes a tener en consideración para el trabajo futuro con el EDM que se genere: 1. Especificar la opción de generación del EDM (a partir de una BD o bien un EDM vacío). 2. Especificar la cadena de conexión a la BD (que como siempre, puede ser un archivo físico o bien una

instancia de SQL Server). 3. Especificar que objetos de la BD queremos que formen de nuestro EDM (tablas, vistas y procedimientos almacenados). Una vez concluido el asistente, tendremos creado el modelo de entidades que en esencia es un fichero .edmx que contiene toda la definición del modelo. Si inspeccionamos el modelo veremos: • Se han generado tantas entidades como tablas de la BD relacional. • Al seleccionar cada entidad, podremos ver los detalles de la misma en cuanto a miembros y la correspondencia de los campos de la entidad con sus equivalentes en la tabla de la BD. • El explorador del modelo nos permitirá ir navegando por los componentes del mismo: entidades, asociaciones entre entidades, funciones, etc. • Finalmente, para tener una idea del código generado por el asistente, basta con que nos vayamos al Class Viewer o al Object Browser e inspeccionemos los distintos elementos generados.

Consultando Entidades Una de las formas que tenemos para definir consultas contra el EDM es a través de LINQ To Entities que nos dota de toda la potencia y capacidades de LINQ sobre ADO.NET Entity Framework, así como funcionalidad de ORM (Object Relational Model), de manera que los desarrolladores pueden materializar sus entidades en tipos del CLR y programar de forma más sencilla contra el EDM y la base de datos. Lo primero que tenemos que hacer es añadir a nuestra aplicación las referencias necesarias: • System.Data.Entity; • System.Data.DataSetExtension; • System.Data; Se asume que ya se ha referenciado la componente del modelo y se ha incorporado el namespace que lo encapsula:

/* Instancia del modelo de entidades creado */ EmpresasEntities modeloEmpresas = new EmpresasEntities(); /* Consulta de entidades */ var empleados = (from empleado in modeloEmpresas.Empleado select empleado); Console.WriteLine("***********Consulta LINQ To Entities***********"); foreach (Empleado emp in empleados) { /* Muestra la información del Empleado */ Console.WriteLine("Rut: {0}, Nombre : {1} {2}, Empresa : {3} ", emp.Rut, emp.Nombres, emp.Apellidos, emp.Empresa1.RazonSocial); } Console.ReadLine();

Como vemos, lo primero que se debe hacer es crear un objeto que es la instancia del ObjectContext del EDM, para el caso EmpresasEntities el cual es un objeto que se ha sido añadida al modelo en el momento de su creación y que hereda de ObjectContext, clase que se encarga de mantener la conexión e información de los metadatos necesaria para leer, escribir, actualizar o eliminar entidades en la base de datos.Si una consulta nos devuelve un objeto del modelo, este es persistido a través de otras consultas mientras que exista el objeto de contexto correspondiente. Sin más, la salida por pantalla que se obtiene de la consulta anterior es:

Uno de los aspectos a destacar en el código anterior tiene relación con la carga de la Empresa relacionada al Empleado, desde la cual se obtiene su nombre. Esto es posible por la navegación declarada al momento de la creación del modelo y que se ha identificado por la relación que se tiene en el modelo de datos subyacente, es decir, lo que el Esquema Conceptual a inferido del Esquema del Almacén.

Operaciones de actualización, inserción y eliminación de entidades ADO.NET EF a través de LINQ To Entities nos permite realizar de manera sencilla operaciones de actualización, inserción o eliminación a través de la interacción con las entidades del modelo. Para actualizar una entidad, basta con crear una instancia de la misma a partir de realizar una consulta a la base de datos de los resultados a actualizar (consulta con C # plano o mediante query expression): Console.WriteLine("***********Actualizando las Entidades***********"); /* Instancia del modelo de entidades creado */ EmpresasEntities modeloEmpresas = new EmpresasEntities(); /* Consulta para obtener la entidad que se actualizará */ /* Empleado Bart Wall */ Empleado empleadoModificado = modeloEmpresas.Empleado.First ( emp => emp.Rut == 1005811 ); Console.WriteLine("Nombre Empleado = {0} {1}", empleadoModificado.Nombres, empleadoModificado.Apellidos); /* Cambia su Apellido y actualiza el modelo */ empleadoModificado.Apellidos = "Simpson"; modeloEmpresas.SaveChanges(); Console.WriteLine("Nuevo Nombre = {0} {1}", empleadoModificado.Nombres, empleadoModificado.Apellidos); Console.ReadLine(); Como se observa, la clave para llevar los datos a la base de datos está en el método SaveChanges(). Por otro lado, tal y como sucede con el caso de la primera consulta, gracias a que el objeto ObjectStateManager se encarga del tracking de los datos, los antiguos y nuevos valores se mantienen en el contexto de la aplicación y los cambios se pueden guardar en la BD. La salida por pantalla de la operación de actualización es:

Para añadir una entidad nueva basta con crear una nueva instancia de la entidad deseada, especificar sus propiedades y añadirla al modelo: Console.WriteLine("***********Añadiendo nuevas Entidades***********"); EmpresasEntities modeloEmpresa = new EmpresasEntities(); /* Crea la nueva instancia del empleado */ Empleado empleadoNuevo = new Empleado(); empleadoNuevo.Rut = 12345678; empleadoNuevo.Dv = "9"; empleadoNuevo.Nombres = "Juan"; empleadoNuevo.Apellidos = "Perez"; /* Carga y asigna la empresa respectiva "Trukilanis International Corp." */ Empresa empresa = modeloEmpresa.Empresa.First(e => e.Rut == 98691599); empleadoNuevo.Empresa1 = empresa; //Accede por la Entidad /* Agrega el empleado al modelo y lo actualiza */ modeloEmpresa.AddToEmpleado(empleadoNuevo); modeloEmpresa.SaveChanges(); var agregados = (from empleado in modeloEmpresa.Empleado where empleado.Rut == 12345678 select empleado); foreach (Empleado empleado in agregados) { /* Muestra la información del Empleado */ Console.WriteLine("Rut: {0}, Nombre : {1} {2} ", empleado.Rut, empleado.Nombres, empleado.Apellidos); } Console.ReadLine();

En este caso la clave para preservar los datos en la BD está en el método AddToEmpleado() que es generado automáticamente en el modelo de creación del EDM y que recibe un objeto del tipo de la entidad a añadir, así como en el método SaveChanges().

Se deben poner atención que para este caso particular al haber una navegación definida para la propiedad Empresa de la entidad Empleado, se debe asignar la instancia de Empresa correspondiente. Si esta agregación se hace con una nueva instancia (new Empresa();), se considera que dicha instancia también es agregada al modelo y por lo tanto será creada. La correspondiente salida por pantalla es:

Para realizar el borrado de una entidad, se sigue la misma filosofía que para el caso de la actualización e inserción, sólo que en este caso se utiliza el método DeleteObject() y a continuación SaveChanges() para poder llevar los datos a la base de datos:

Console.Clear(); Console.WriteLine("*********** Eliminando Entidades***********"); /* Instancia del modelo de entidades creado */ EmpresasEntities modeloEmpresas = new EmpresasEntities(); /* Consulta para obtener la entidad que se eliminará */ /* Empleado Juan Perez */ Empleado empleadoEliminado = modeloEmpresas.Empleado.First ( emp => emp.Rut == 12345678 ); Console.WriteLine("Nombre Empleado = {0} {1}", empleadoEliminado.Nombres, empleadoEliminado.Apellidos); Console.WriteLine("Empleado antes de borrar {0}", modeloEmpresas.Empleado.Count()); modeloEmpresas.DeleteObject(empleadoEliminado); modeloEmpresas.SaveChanges(); Console.WriteLine("Empleado después de borrar {0}", modeloEmpresas.Empleado.Count()); Console.ReadLine();

La salida por pantalla es:...


Similar Free PDFs