Creación del modelo de datos
Introducción
Microsoft pone a disposición una versión Express de SQL Server 2019, su motor de base de datos en versión gratuita. SQL Server le permite crear bases de datos relacionales para almacenar y recuperar los datos de sus aplicaciones, utilizando para ello el lenguaje SQL y las clases proporcionadas por el Framework .NET. Para seguir los ejemplos de este capítulo, instale SQL Server 2019 Express (https://www.microsoft.com/es-es/sql-server/sql-server-downloads) con los parámetros por defecto.
Microsoft ofrece una solución de mapeo de objetos relacionales llamada Entity Framework. Se trata de una librería que permite crear la capa de acceso a los datos (una capa de abstracción que ya no hace necesario que los desarrolladores accedan directamente a la base de datos). La comunicación se realiza a través de entidades que se definen en un modelo EDM (Entity Data Model). Este modelo se usa para las operaciones en la base de datos y la generación de las consultas SQL.
Comience por agregar un nuevo proyecto de tipo Biblioteca de clase (.NET Framework) llamado Database:
![images/cap17_img_01.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_01.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
La creación de un modelo
Para ilustrar el uso del Entity Framework en el proyecto SelfMailer, vamos a crear un modelo de datos que permite almacenar en una base de datos varias configuraciones de servidores de mail y, para cada una de ellas, uno o varios expedidores.
Agregue una nueva carpeta Entidades al proyecto Database y después agregue un elemento ADO.NET Entity Data Model, llamado SelfMailer.edmx.
![images/cap17_img_02.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_02.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Se muestra la ventana Asistente para Entity Data Model que le ofrece cuatro opciones:
![images/cap17_img_03.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_03.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
-
EF Designer desde la base de datos: esta opción le permite elegir una base de datos y los objetos de la misma que se deberán modelizar.
-
Modelo vacío de EF Designer: esta opción crea un modelo sin entidades. Se deberán crear manualmente en el modelo.
-
Modelo vacío de Code First: esta opción crea un modelo Code First vacío. Las entidades tendrán que crearse manualmente en el modelo mediante código.
-
Code First desde la base de datos: esta opción le permite elegir una base de datos y los objetos de la misma que servirán de base para un modelo Code First.
Dando por hecho que el proyecto no contiene ninguna base de datos, elija Modelo vacío de EF Designer y pulse en el botón Finalizar. Visual Studio crea un archivo SelfMailer.edmx vacío y añade al proyecto las referencias a las librerías utilizadas por el Entity Framework.
La creación de entidades
Después de su creación, Visual Studio abre el archivo SelfMailer.edmx en el editor.
Abra el menú contextual del editor y elija el menú Agregar nuevo - Entidad...:
![images/cap17_img_04.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_04.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Se abre la ventana Agregar entidad. Asigne el nombre MailServer a la entidad y MailServerSet del juego de entidades. La propiedad de clave se corresponde con la clave primaria de una tabla SQL y permite identificar de manera única un registro. Deje ID como nombre de la propiedad de clave y el tipo Int32. Pulse en el botón Aceptar.
![images/cap17_img_05.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_05.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
El campo Tipo base permite especificar la herencia de la nueva entidad.
El editor muestra el esquema de la entidad MailServer:
![images/cap17_img_06.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_06.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Para añadir propiedades a una entidad, abra el menú contextual de la entidad y seleccione el menú Agregar nuevo - Propiedades escalares. Aparece un nuevo campo en el esquema. Rellene el nombre Host. Haga lo mismo para una propiedad escalar llamada Username. No se pide ninguna otra información para la creación.
Sin embargo, es posible modificar las propiedades desde la ventana Propiedades. Puede definir el tipo de la propiedad, si admite valores nulos o no, su valor por defecto e incluso el nivel de acceso de sus descriptores de acceso:
![images/cap17_img_07.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_07.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Se pueden añadir dos tipos complejos a una entidad. Un tipo complejo es una propiedad que contiene subpropiedades. Abra la ventana Explorador de modelos (menú Ver - Otras ventanas - Explorador...
La generación de la base de datos
Una vez que el modelo está completo hay que crear la base de datos. Aquí también Visual Studio nos ofrece una herramienta para administrar.
Abra el menú contextual del editor de modelos y seleccione Generar base de datos desde el modelo.... Se abre el asistente de generación de la base de datos. Pulse en el botón Nueva conexión..., elija Microsoft SQL Server como fuente de datos y pulse en el botón Continuar.
Se abre la ventana Propiedades de la conexión:
![images/cap17_img_12.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_12.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Puede conectarse a cualquier servidor de bases de datos, bien de manera local, en un servidor remoto o en la nube. Escriba en el campo Nombre del servidor el nombre del servidor sobre el que quiere crear la base de datos (aquí, el carácter . representa al servidor local). Si realiza la instalación de SQL Server 2019 Express por defecto, el nombre del servidor es .\SQLEXPRESS. A continuación, indique el nombre SelfMailer para el nombre de la base de datos. Pulse el botón Aceptar. Como la base de datos no existe, un cuadro de diálogo le pide confirmación para crearla.
De vuelta al asistente de generación de la base de datos, se rellena el campo de la conexión y se muestra la cadena de conexión. Pulse en el botón Siguiente. La ventana muestra, a continuación, una vista previa del script SQL generado. Haga clic, por último, en el botón Terminar. El asistente crea un archivo SelfMailer.edmx.sql que contiene las instrucciones SQL que permiten administrar la base de datos:
-- -------------------------------------------------- ...
La creación de entidades a partir de código (Code First)
El enfoque de diseño de la base de datos que acabamos de ver, es muy gráfico. Se trata del modelo que utiliza Visual Studio para administrar las clases .NET del modelo de datos y también para administrar la base de datos. Entity Framework, además de este diseño por modelo de la base de datos, ofrece la posibilidad de definir y diseñar una base de datos a partir de código. Este método se llama Code First. El diseño a partir del código le permite definir sus clases de negocio y los atributos que se asociarán a las clases y miembros que permitirán definir el esquema de la base de datos.
Para utilizar el enfoque de creación del modelo a partir de código, lo primero es añadir el paquete NuGet EntityFramework. Abra el menú contextual del proyecto Database y, a continuación, pulse en el elemento Administrar paquetes NuGet.... En la ventana, seleccione el paquete EntityFramework y pulse en el botón Instalar si todavía no lo ha hecho.
![images/cap17_img_15.png](https://www.eni-training.com/download/cb4d16bc-b456-4eae-9079-208b5b5de012/images/cap17_img_15.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Tras la instalación de Entity Framework, NuGet habrá creado una carpeta llamada packages al mismo nivel que su solución. Esta carpeta contiene todos los datos del paquete EntityFramework y, en particular, la librería EntityFramework.dll. Un archivo packages.config se ha añadido también a la raíz del proyecto SelfMailer:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EntityFramework" version="6.2.0"
targetFramework="net48" />
...