Modelo de Entity Framework Core: Database First y Code First

Modelo de Entity Framework Core: Database First y Code First

¿Qué es Entity Framework Core?


Entity Framework es un ORM (Object-Relational Mapping) para .NET. De forma resumida, con un ORM podemos mapear o convertir las tablas y relaciones de nuestra base de datos en objetos de nuestro sistema o aplicación, dejando entonces de manipular la base de datos a nivel SQL para hacerlo mediante nuestro código.

Entity Framework Core es cross-platform o multi-platform, por lo cual funciona en Windows, Linux y Mac. Además, puede trabajar con consultas LINQ y nativas, admite seguimiento de cambios y migraciones de esquema, al tiempo que es compatible con varias bases de datos.

Puedes conocer más aquí.

El modelo

Como dice la documentación oficial, Entity Framework Core accede a los datos mediante un modelo compuesto por las entidades y por un objeto de contexto, el cual representa a la sesión de base de datos y permite consultar y guardar los datos.

Para generar este modelo tenemos tres opciones:

  • Code First: crear primero el modelo (entidades y contexto). La base de datos se genera a partir de nuestro código, usando migraciones.
  • Database First: el modelo se genera a partir de una base de datos ya existente.
  • Manual: el modelo se codifica manualmente para que coincida con una base de datos ya existente.

A continuación, ahondaré sobre Code First y Database First, pero para que puedas aplicarlo en tu computadora, debes cumplir estos requisitos:

  • Visual Studio instalado.
  • Base de datos. Para los ejemplos usaré MariaDB con Xampp, pero puedes usar cualquier base de datos que esté en la lista de Proveedores de Bases de Datos para EF Core.

Migraciones

Las migraciones nos permiten tener sincronizados el modelo y nuestra base de datos. Como las aplicaciones tienen un constante cambio o mejora, muchas veces necesitamos agregar o quitar parámetros en las tablas o relaciones.

Con la migraciones podemos subir cambios incrementales, por lo que si hacemos un cambio en el modelo, podemos sincronizarlo con la base de datos haciendo actualizaciones sin necesidad de borrar los datos existentes usando las herramientas de consola de EF Core.

Para crear una migración se usa el comando > Add-Migration nombreDeLaMigración.

Ten en cuenta que las migraciones reciben un nombre descriptivo para que después sea más fácil entender el historial del proyecto.

Configuraciones iniciales

Para ambos modos usaremos como ejemplo dos entidades, Libro y Autor, donde un autor puede tener muchos libros.

Creamos un nuevo proyecto. Para los ejemplos, creé un ASP.NET Core Web API solution.

Instalamos los siguientes paquetes desde nuget:

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Tools

Pomelo.EntityFrameworkCore.MySql

Para verificar si los tools de Entity Framework Core se instalaron correctamente:

1) Abrimos la consola del Administrador de paquetes:

Tools -> Nuget Package Manager -> Package Manager Console

2) Ejecutamos el siguiente comando:

Observaremos una salida similar a la de la imagen.

Con todos estos conceptos y con las herramientas instaladas, ya podemos generar nuestros modelos.

Code First

Como mencionamos, para generar el modelo con la opción Code First primero creamos el modelo (entidades y contexto) y, con este código mediante migraciones, generamos la base de datos.

A continuación, creamos una clase para autor y otra para libro:

Author.cs

Libro.cs

Estas clases tienen tres notaciones que tal vez son nuevas para ti. La primera es Table, usada para enlazar la clase con la tabla en la base de datos. La otra es Key, empleada para definir Id como primary key, además de definirla como requerida u obligatoria con Required.

Con estas clases ya tenemos la parte de entidades y podemos crear el contexto:

BookContext contiene las entidades que creamos anteriormente. A través de DbSet las configuramos con la base de datos y se habilitan para que podamos hacer operaciones sobre ellas.

En la función OnModelCreating definimos las relaciones que existen entre nuestras entidades. Asimismo, en la función OnConfiguring configuraremos el connection string de nuestra base de datos. Por ejemplo, para una base de datos en MariaDb tenemos:

server=localhost; port=3306; database=bdauthors; user=root; password=;

En database insertamos el nombre de nuestra base de datos. No importa si no existe: con la primera migración se creará.

Para crear la base de datos necesitamos generar la migración. En la consola del Administrador de paquetes ejecutamos el comando:

> Add-Migration Initial

Este comando crea una nueva carpeta en el proyecto que son las migraciones.

Para ejecutar estos nuevos archivos, en la consola del Administrador de paquetes ejecutamos el comando:

> Update-Database

Con ese comando ya tenemos creada la base de datos y las tablas.

Si cambias el modelo, solo debes crear otra migración y hacer el update de ésta, así tendrás los cambios sin modificar las tablas con SQL.

Database First

Para generar el modelo con la opción Database First generamos el modelo a partir de una base de datos que ya existe. Este proceso se hace con el comando Scaffold-DbContext. Este comando generará el código para el context y las entidades, al tiempo que  recibe como parámetro el connection string de la base de datos existente, el provider que es el nombre del package nuget que estamos usando y también el nombre de la carpeta en donde queremos que genere el modelo. Tiene otras opciones de parámetros, pero éstas son las más importantes.

En la consola del Administrador de paquetes ejecutamos el comando:

> Scaffold-DbContext "server=localhost; port=3306; database=bdauthors; user=root; password=;" Pomelo.EntityFrameworkCore.MySql -OutputDir BookModel

Este comando generará nuestro modelo en la carpeta BookModel, donde se encuentran las entidades y el contexto.

A partir de este modelo podemos también trabajar con migraciones.

Ambas formas de crear el modelo te permitirán automatizar tareas ya sea la creación de la base de datos o la codificación del modelo.

Elegir uno o el otro depende mucho de las necesidades y el contexto de tu proyecto, un proyecto con pocas tablas tal vez sea mejor trabajarlo con code first a otro que tenga muchas tablas con muchas relaciones entre ellas, puede resultar difícil gestionarlo solo en el código.

Evalúa cuál es la mejor opción para tu proyecto. ¡Éxito!

⚠️
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Revelo.

Revelo Content Network da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.