Está en la página 1de 27

PROGRAMACIÓN DE COMPONENTES DE

ESCRITORIO
UNIDAD Nº 2

Implementación de persistencia en aplicaciones WPF

www.iplacex.cl
SEMANA 4

Introducción
Almacenar la información presente en un sistema, es realmente importante si estos
registros deben ser administrados de forma constante. Agregar nuevos, listar los ya
existentes, actualizar algunos de sus o derecha y llanamente eliminarlos son solo
algunas de las acciones que es posible nombrar al momento de realizar esta gestión.
Estos registros, generalmente estarán dispuestos dentro de una base de datos, la cual
puede ser de tipo relacional. Si es este el caso, entonces, para poder gestionar la
información almacenada se utilizan sentencias sql.

La mayoría del tiempo, estas sentencias sql son escritas directamente en el código fuente
de un programa, lo que supone un riesgo de seguridad, ya que, es más probable que el
software sea propenso a ataques de robo de datos, como lo es la inyección sql. Dentro
de este tipo de base de datos, existirán estructuras que nos permitirán aislar las tablas .
Estas estructuras son los procedimientos almacenados, las vistas y las funciones.

Sin embargo, estos entes, también deben ser invocados utilizando sentencias sql, por lo
que, también pueden llegar a inseguras.

Como solución a esto, existen los ORM, como Entity Framework que son modelos de
programación que permiten generar modelo de entidades que representen a la base de
datos a nivel del código de la aplicación, pero sin la necesidad de exponer las sentencias
sql que los acompañan.

En esta semana, se estará realizando la implementación de la base de datos dentro de


una aplicación de escritorio por medio de un modelo de entidades creado con Entity
Framework.

www.iplacex.cl2
Ideas Fuerza
Modelo de entidades: representación de una base de datos en forma de código
de programación, el que será determinado en base al ORM implementado.

Entidad: es la representación de tablas y vistas dentro de un modelo de


entidades.

SQL Injection: ataque informático que supone la inserción de sentencias sql


maliciosas en el código de una aplicación. Puede ser utilizado para el robo de
información o la detección de backdoors y problemas de seguridad dentro de
una app al momento de implementar sentencias sql mal escritas.

www.iplacex.cl3
Desarrollo
1. Arquitectura de la aplicación

En la semana 2 de la asignatura, se estableció que MVC (Model-View-Controller) sería


la arquitectura para implementar en el desarrollo de la aplicación, contemplando la
siguiente estructura:

Imagen 1: Arquitectura MVC para aplicación de escritorio

Fuente: www.iplacex.cl

Ya se estableció que WPF actuará como framework de desarrollo de las interfaces de


usuario. Pero, tanto para la capa de modelo y la capa de negocio o controlador, se deberá
utilizar un proyecto de tipo biblioteca de clases para cada una de estas capas.

Durante esta semana entonces, nos centraremos en:


• Implementar la capa de datos compuesta de SQL Server como gestor
de base de datos Entity Framework como generador del modelo de
entidades.
www.iplacex.cl4
• Implementar la capa de negocio o controladores, utilizando el modelo de
entidades generado, utilizando LINQ para generar consultas a las estructuras
presentes en el modelo.
• Implementar en las vistas de usuario, el o los controladores necesarios para
permitir la administración de registros.

2. ORM

Tomemos el código de la siguiente imagen como ejemplo:

Imagen 2: Selección de registros a base de datos utilizando sentencia sql

Fuente: www.iplacex.cl

Este código permite ejecutar una sentencia select por medio de la clase SqlConnection
a la base de datos que se esté utilizando. Este select realizará una consulta a la tabla y
retornará los datos solicitados para ser mostrados por pantalla en la aplicación de
consola.

www.iplacex.cl5
Si te fijas, no tiene nada de malo este código. Ejecuta cada una de las instrucciones
dadas para retornar un resultado.

En este caso en particular, se trata de un select bastante simple. Sin embargo, cuando
se trata de sentencias muchos más largas, complejas y detalladas, un desarrollador
puede cometer un error de tipeo y la sentencia (sea cual sea) no funcionará o arrojará
algún error. O peor aún, las instrucciones sql entregadas funcionan de maravilla, pero,
son propensas a ataques de inyección sql (SQL Injection).

Aunque existen formas de evitar exponer de forma directa las tablas de una base de
datos, como lo puede ser por medio de la implementación de vistas, procedimientos
almacenados o funciones; esto no asegura que no puedan existir fallos o ataques
externos que intenten vulnerar la seguridad del sistema o de la aplicación que está en
construcción, ya que también deben ser invocadas por medio de sentencias sql que
quedan escritas directamente en el código fuente del programa.

Un camino que permite aplicar seguridad y previene que los desarrolladores cometan
errores al momento de escribir una sentencia sql compleja en el código es por medio de
la implementación de los ORM.

Un ORM u Object Relational Mapping es un modelo de programación que permite


mapear estructuras de una base de datos en forma de entidades.

Una entidad será la representación de estructuras como lo son las tablas y vistas en
forma de clases dentro de una aplicación. Estas entidades tendrán la misma estructura
a nivel de propiedades, considerando los nombres y tipos de datos que correspondan al
lenguaje de programación utilizado, que en este caso vendría siendo C#.

El objetivo principal de un ORM es facilitar, simplificar y acelerar el proceso de desarrollo


de las aplicaciones, sirviendo de capa de abstracción, comunicación y seguridad, tanto
para la base de datos como el programa en sí.

www.iplacex.cl6
Imagen 3: Modelo de entidades compuesto por vista

Fuente: www.iplacex.cl

Según el lenguaje de programación y base de datos pueden existir uno o más ORM.
Para esta asignatura, al estarse utilizando C# y SQL Server, por razones de sinergia
entre tecnologías, se estará implementando Entity Framework para generar el modelo
de entidades.

www.iplacex.cl7
3. Capa de datos y Entity Framework

A lo largo de los años, los desarrolladores se han enfrentado a dos grandes


contratiempos:

• Modelar cada una de las entidades de la base de datos, considerando relaciones


entre tablas y validaciones
• Trabajar con el o los motores utilizados para leer y escribir la data manipulada por
el usuario
• Minimizar las chances de robo o fuja de información sensible por medio de
diversos tipos de ataques informáticos

Para suerte nuestra, existen los ORMs, sistemas que ya vimos en el punto anterior y que
permiten mapear estructuras de una base de datos en forma de entidades para ser
aplicadas en el código.

Entity Framework o EF es una de este tipo de sistemas, y pertenece al conjunto de


tecnologías de ADO.NET que soporta el desarrollo de aplicaciones orientada a datos.
Este permite a los desarrolladores implementar modelos sin la necesidad de
necesariamente preocuparse de tablas, vistas, procedimientos y la estructura que los
acompaña.

Un modelo dentro de Entity Framework será la representación de como las clases y


propiedades de la aplicación son mapeadas a las tablas y columnas que correspondan
respectivamente. Este mismo comportamiento se aplica para las vistas presentes en una
base de dato en específico.

Adicionalmente, también será posible trazar otro tipo de estructuras, como lo son los
procedimientos almacenados, los cuales se comportarán como métodos dentro del
modelo generado a partir de la base de datos.

Imagen 4: Ejecución de procedimiento almacenado desde modelo de


entidades

www.iplacex.cl8
Fuente: www.iplacex.cl

En la imagen anterior se está ejecutando el procedimiento almacenado encargado de


eliminar un registro de la tabla Producto, para luego escribir los cambios dentro de la
base de datos. Gracias a EF, esta ejecución vista como un script T-SQL sería:

EXEC Supermercado.dbo.spProductoDelete @field = value


GO

Lo anterior, evita el error humano al momento de implementar este tipo de sentencias y


también no expone directamente la base de datos ni sus tablas para ataques maliciosos.

Una de las grandes ventajas de EF, es que, al dar vida a estos modelos, permite a los
desarrolladores realizar consultas directamente a las entidades y relaciones presentes
en el modelo generado. Por “detrás”, este ORM se encargará de traducir cada una de
estas instrucciones a los comandos o scripts necesarios para poder manipular los datos
dentro de una base de datos, es decir, traduce código C# a sentencias de T-SQL

Para obtener estos modelos y que puedan ser implementados dentro de una aplicación,
existen diversos para conseguir el mapeo de estructuras. En EF podemos encontrar
cuatro:

• EF Designer from database: permite generar el diseño de entidades a partir de


una base de datos existente, especificando que estructuras se desean
implementar, pudiendo ser estas tablas, vistas, procedimientos almacenados y
funciones. Esta opción generará para cada una de las tablas y vistas
seleccionadas, la clase con la que será representada en el modelo. Para el caso
de procedimientos almacenados, estos serán dispuestos en forma de métodos.

• Empty EF Designer model: permite crear tablas dentro de una base de datos a
partir de un modelo de entidades (clases) vacio diseñado en EF.

www.iplacex.cl9
• Empty Code First model: permite crear una nueva base de datos a partir de las
clases definidas dentro del modelo, en donde estas serán usadas para la creación
de las tablas.

• Code First from database: permite definir el modelo utilizando clases de C#, pero
que serán aplicadas dentro de una base de datos ya existente.

Imagen 5: Creación de modelo de entidades a partir de base de datos


existente

Fuente: www.iplacex.cl

www.iplacex.cl10
La aplicación de uno de estos modelos en un proyecto dependerá de si ya existe una
base de datos con tablas, si existe una base de datos vacía, o si se desea crear tanto la
base de datos y las tablas que contenga.

Para el caso de esta asignatura, como ya existe una base de datos con sus respectivas
tablas, es necesario implementar EF Designer from database para la creación del modelo
de entidades, el que estará compuesto de vitas y procedimientos almacenados
solamente.

¿Recuerdas el caso de Supermercado que fue visto en el material de la semana 3?


Vayamos a crear su modelo de entidades.

Lo primero será crear un proyecto de Biblioteca de clases .Net Framework, en donde se


deberá instalar Entity Framework para poder generar el modelo de entidades. Dentro de
este se deberá agregar un elemento ADO.NET, para posteriormente, generar la conexión
con la instancia de SQL Server, en donde se deberá escoger la base de datos que
corresponda, que en este caso es Supermercado.

www.iplacex.cl11
Imagen 6: Conexión a base de datos Supermercado

Fuente: www.iplacex.cl

www.iplacex.cl12
Esta acción, arrojará un trozo de código conocido como cadena de conexión o
ConnectionString. Este actuará como puente de conexión entre el modelo de entidades
y la base de datos seleccionada.

Imagen 7: Cadena de conexión resultante

Una vez, entonces creada esta conexión, es necesario especificar que estructuras serán
importadas de la base de datos y que serán incorporadas dentro del modelo de
entidades. Es posible escoger tablas, vistas, procedimientos almacenados y también
funciones. En esta ocasión solo nos centraremos en las vistas y procedimientos
almacenados, ya que no se estarán utilizando las tablas dentro del modelo ni tampoco
las funciones, ya que estas deben ser ejecutadas por medio de procedimiento
almacenados para que puedan ser utilizables por el modelo.

www.iplacex.cl13
Imagen 8: Selección de estructuras a incluir dentro del modelo de
entidades

www.iplacex.cl14
Fuente: www.iplacex.cl

Finalmente, obtendremos el modelo. En este, gráficamente solo existirá la


representación de las vistas y de tablas que fueron seleccionadas, ya que los
procedimientos almacenados son representados como métodos, especificando los
parámetros de entrada (nombre y tipos de datos) que correspondan.

Imagen 9: Visualización de modelo de entidades

Fuente: www.iplacex.cl

El próximo paso será implementar este modelo de entidades dentro de la capa de


negocio. Para eso, primero repasaremos que es el CRUD.

www.iplacex.cl15
4. Capa de negocio, instancia de persistencia y CRUD

La capa de negocio o de controlador presente en la arquitectura se encargará de servir


como intermediario entre la capa de datos y la interfaz de usuario. Esta nueva capa será
un proyecto de tipo Biblioteca de Clases (.NET Framework) y estará compuesta por
diversas clases, cada una con un rol a jugar. Estas clases serán:

• CommonBC
• IPersistente
• Clase principal
• Clase Collection
• Clase Reportes

CLASE REPORTES

La creación de la clase de reportes será vista en el recurso conceptual de


la semana.

CommonBC

El modelo de entidades generado por Entity Framework se comporta como una clase.
Por ende, es posible crear una instancia de objeto de esta y así poder generar la
comunicación con la base de datos, además de poder utilizar las distintas estructuras
presentes en el modelo.

Para este fin se utiliza la clase CommonBC. Esta, generar una instancia estática del
modelo de entidades, cosa de evitar, que cada vez que se instancie a la clase
CommonBC, se generen nuevas conexiones a la base de datos.

www.iplacex.cl16
Imagen 10: Clase CommonBC e instancia del modelo

Fuente: www.iplacex.cl

En este caso, como se está trabajando con el ejemplo de Supermercado, se genera


una instancia estática de SupermercadoEntities.

IPersistente

Al momento de trabajar con bases de datos, o algún tipo de colección, existen cuatro
acciones principales a realizar sobre los registros almacenados: agregar uno nuevo,
leerlo, actualizarlo y eliminarlo. Estas acciones se pueden repetir para muchas clases.
Por ende, al tratarse de un denominador en común, se genera una interface, la cual
contendrá la firma de el o los métodos en común que puedan ser aplicados para uno o
más clases alrededor de la aplicación.

www.iplacex.cl17
Específicamente, estos métodos serán Create(), Read(), Update() y Delete(), es decir, el
famoso CRUD.

Imagen 11: Firmas de método en interface IPersistente

Fuente: www.iplacex.cl

Estos métodos posteriormente serán implementados en la clase principal, la cual será


descrita a continuación.

Clase principal

Esta clase contendrá la misma estructura de la tabla presente en la base de datos


considerando los campos y tipos de datos correspondientes, pero, además, tendrá la
implementación de los métodos de la interface creada.

Por un lado, si consideramos el ejemplo de Supermercado, a nivel de propiedades, la


estructura es la siguiente:

www.iplacex.cl18
Imagen 12: Clase Producto

Por otro lado, los métodos de la interface que, además, implementan los procedimientos
almacenados y la vista presentes en el modelo de datos, lucirán de la siguiente manera:

Imagen 13: Métodos CRUD en clase Producto

Fuente: www.iplacex.cl

www.iplacex.cl19
Por un lado, Create será la representación de la acción para crear un nuevo registro
dentro de la base de datos. En nuestro caso, esta acción ejecutará el procedimiento
almacenado correspondiente a agregar un nuevo registro en una tabla.

Imagen 14: Método Create implementado en clase Producto

Fuente: www.iplacex.cl

Read, por su parte, se encargará de obtener la información de un registro desde de una


tabla o de la vista, siendo en esta última la forma la que se aplicará en esta asignatura,
aplicando el o los filtros necesarios para conseguir la fila requerida.

www.iplacex.cl20
Imagen 15: Método Read implementado en clase Producto

Fuente: www.iplacex.cl

Estos filtros, pueden ser aplicados por medio de LINQ. Este es un conjunto de
tecnologías que permite realizar búsqueda de elementos dentro de colecciones y de
estructuras como lo pueden ser lo manifiestos XML. En esta ocasión, se implementa para
realizar la búsqueda de un Producto en base a su campo de Id.

Update, por otro lado, se utilizará para actualizar uno o más valores de un registro
presente en una tabla. Este registro estará determinado por la implementación de un
filtro, que por lo general será el Id. Este método ejecutará un procedimiento almacenado,
el cual se encargará de modificar los valores de un registro en particular.

www.iplacex.cl21
Imagen 16: Método Update implementado en clase Producto

Fuente: www.iplacex.cl

www.iplacex.cl22
Finalmente, Delete, se encargará de eliminar un registro de la tabla por medio de un
procedimiento almacenado, el cual recibirá el Id del Producto como filtro.

Imagen 17: Método Delete implementado en clase Producto

Fuente: www.iplacex.cl

Clase Collection

Anteriormente, vimos cómo obtener un registro en específico por medio de su campo


identificador. Esto puede ser aplicado, por ejemplo, al momento de cargar un formulario
con los datos a actualizar por parte del usuario.

Sin embargo, para poder nutrir de registros una grilla de datos, ese método Read() no
nos servirá.

Por consecuencia, para poder extraer dos o más elementos, o directamente todos los
registros de la vista, es posible realizarlo por medio de la implementación de una nueva
clase denominada ProductoCollection, la que contendrá la siguiente estructura:

www.iplacex.cl23
Imagen 18: Clase ProductoCollection y sus métodos

Fuente: www.iplacex.cl

En esta obtención de una colección de registros, se utilizan dos métodos, uno encargado
de obtener la lista de datos, transformando cada uno de los registros obtenidos por medio
de la vista, en objetos de la clase Producto, para luego ser almacenados en una lista
interna.

Luego, el resultado de llenar dicha lista es retornado por el método ReadAll(), el cual será
utilizado para llenar las distintas grillas de datos que puedan existir en el proyecto.

www.iplacex.cl24
Conclusión
Los ORMs son sistemas complejos. Permiten crear modelos de entidades a partir de una
base de datos e importar varias de sus estructuras para ser representadas en forma de
clases, si es que son vistas o tablas, o en forma de métodos, si se trata de procedimientos
almacenados.

Esto, acelera el proceso de desarrollo al evitar que los desarrolladores deban escribir las
sentencias sql directamente en el código de una app.

También, al representar la base de datos y permitir trabajar directamente con esta sin,
muchas veces, necesariamente conocer la estructura de esta.

Entonces, aplicar este tipo de sistemas dentro de una app, permite facilitar la
administración de la información almacenada, pero también asegurarla a fugas de datos
o ataques de algún tipo.

www.iplacex.cl25
Bibliografía
ORM
https://www2.deloitte.com/es/es/pages/technology/articles/que-es-orm.html

Entity Framework
https://entityframework.net/what-is-ef

Creating a Model
https://docs.microsoft.com/en-us/ef/ef6/modeling/

CRUD
https://developer.mozilla.org/es/docs/Glossary/CRUD

www.iplacex.cl26
www.iplacex.cl27

También podría gustarte