Este tutorial hace parte de la serie Introducción rápida a ASP.NET MVC:

Modificando el modelo

Vamos a modificar el modelo de datos agregando una nueva tabla y relacionándola con la que creamos anteriormente. La idea es crear una tabla con los posibles géneros de videojuegos que existen, para luego relacionar un juego con el género al cuál pertenece.

Paso 1

Hacemos clic derecho sobre la carpeta Models y luego vamos a Add > Class, le ponemos como nombre Genero. Para esta tabla vamos a necesitar 3 propiedads el Id (que será la Id es la primary key), el nombre del género y su descripción. Adicional, vamos a crear una Propiedad de navegación que nos permitirá desde nuestras clases llegar a los juegos que pertenecen a un género, sin necesidad de tirar una sola línea de sql.

Nótese que las propiedades de navegación se definen como virtual en el Entity Framework. También, notemos que, como varios videojuegos pueden tener un mismo género, los videojuegos relacionados los representamos con una colección IEnumerable.

Paso 2

Abrimos el archivo Videojuego.cs que se encuentra en la carpeta Models y procedemos a modificarlo. Vamos a crear lo que en base de datos se denomina una relación one-to-many (uno a muchos).

Dicho esto, en el videojuego vamos a añadir una propiedad que nos permita saber a qué género pertenece. Esa propiedad será de tipo entera y su valor será el Id del género, la llamaremos GeneroId.

De igual forma, vamos a definir una propiedad de navegación para poder acceder desde el videojuego a los datos del género con el cuál está relacionado.

La propiedad de navegación debe tener un Atributo ForeingKey indicando la propiedad que representa la relación, en nuestro caso, GeneroId. Cuando se sigue el estandar del Entity Framework (así como lo estamos haciendo), no es necesario definir algunas cosas (ver más al respecto), sin embargo, soy de los que prefiere hacerlo por claridad y por si posteriormente decidimos usar Lazy Loading.

Para corregir el error que aparece, recuerda pararte sobre el texto resaltado en rojo y presionar control + . así Visual Studio buscará el namespace en donde están los atributos que permiten definir las propiedades de navegación.

Paso 3

Ya que hemos añadido una clase a nuestro modelo, vamos a modificar el DbContext. Para eso, abrimos el archivo IdentityModels.cs que se encuentra en la carpeta Models, y agregamos la siguiente línea debajo de la propiedad de tipo DbSet que definimos en el capítulo 1 para los Videojuegos, así:

Paso 4

Hasta aquí hemos terminado la modificación de nuestro modelo de datos, es hora de generar las migraciones del Entity Framework para que los cambios se vean reflejados en la base de datos.

Lo primero será abrir la consola yendo al menu Tools > NuGet Package Manager > Package Manager Console, como se ve en la imagen.

Se debería ver la consola así:

En la consola vamos a digitar el siguiente comando para activar las migraciones en nuestro proyecto

enable-migrations

Debería aparecer un mensaje indicando que las migraciones se activaron. Parte del mensaje aparece en color amarillo, no hay problema (¡excepto si sale en ROJO!).

Automáticamente debieron crearse dos archivos dentro de una carpeta llamada Migrations. El primero de ellos representa el estado de la base de datos que ya existía, es decir, antes de las modificaciones que hemos realizado hoy. El segundo, tiene la configuración de las migraciones y un método seed que permite agregar los datos que por defecto debería tener la base de datos al realizarse la primera ejecución de la aplicación (por ejemplo, si tuvieramos una tabla de países, ahí deberíamos llenarla). El método tiene entre comentrarios un ejemplo que pueden revisar.

Paso 5

Vamos a generar una nueva migración con los cambios que realizamos al modelo, para eso digitamos el siguiente comando en la consola:

add-migration

Inmediatamente, la consola nos preguntará por un nombre para identificar la migración, en nuestro caso podemos poner Generos (o algo referente al cambio que se efectuó). Presionamos enter y la migración debería crearse. Si abren el archivo que genero el EF en la carpeta Migrations podrán ver los cambios que se realizarán en la base de datos cuando ejecutemos la migración.

Paso 6

Para que la migración se realice sobre la base de datos se debe ejecutar el siguiente comando:

update-database

Es posible que salga algún error con una clave foránea (no la pusimos nulleable y ya teníamos datos en nuestra bd). En nuestro caso no hay problema y podemos borrarlos, pero en un entorno de producción deberíamos modificar la migración que automáticamente fue generada o permitir datos nulos en la relación (nullable foreign key).

Para borrar toda la base de datos y evitar problemas, ejecutamos el siguiente comando:

update-database -target 0 -force

Finalmente volvemos a ejecutar el comando para actualizar y todo debería estar bien.

Paso 7

Vamos a crear el Controlador para la nueva tabla. Hacemos clic derecho en la carpeta Controllers y vamos a la opción Add > Controller... y en la ventana que se depliega escogemos la opción MVC 5 Controller with views, using Entity Framework. En la ventana que aparece seleccionamos la clase del modelo (Genero) y modificamos el nombre del controlador, como se ve en la imagen:

Como también modificamos el Videojuego, repetimos los mismos pasos para dicho modelo.

Visual Studio nos preguntará si deseamos sobreescribir el controlador ya existente, le decimos que sí.

Después de esto, podemos ejecutar la aplicación e ir a localhost:####/Generos e insertar algunos datos. Luego, cuando abramos localhost:####/Videojuegos e intentemos crear un nuevo registro, debería aparecer un cuadro desplegable que permita escoger un género para el videojuego que estamos insertando.

Paso 8

Para terminar, vamos a abrir el archivo _MostrarVideojuego.cshtml que se encuentra en la carpeta Views > Home y le vamos a añadir la línea de código que aparece resaltada en la imagen.

Esa línea sirve para mostrar el género al que pertenece el juego. Notemos que como definimos previamente la propiedad de navegación, el modelo trae en dicha propiedad toda la información del género con el cuál está relacionado. Todo sin necesidad de tirar una sola línea de sql. :)

¡Terminamos por hoy! Aquí les dejo el repositorio Intro-ASP.NET-MVC con todo lo que hemos hecho y el commit de lo que construímos en este capítulo.

Si quieren ver cómo crear relaciones de muchos a muchos pueden consultar aquí y aquí, con lo que cubrimos hoy debería ser más que entendible. NOTA: no es necesario configurar manualmente lo de HasMany ni HasForeignKey que muestran esos tutoriales (EF lo hace cuando generamos la migración).

Espero sus comentarios y sus dudas. Si les ha gustado ¡dejen un like!

Nos vemos en el capítulo final de esta Introducción Rápida a ASP.NET MVC.