Tutorial Entity Framework Core

Para algunos utilizar Entity Framework Core es confuso, sobre todo si nunca has trabajado con un ORM, en esta especie de tutorial voy a ayudarte a instalar, configurar y utilizar Entity Framework.

Qué es Entity Framework

Entity Framework es un ORM, el fin de este tutorial no es explicarte que es un ORM eso me lo reservo para otro artículo.

Básicamente, lo que hace Entity Framework es mapearnos todas las tablas de la base de datos que le especifiquemos y realizar todas las acciones que realizamos con SQL mediante LINQ como si nuestra base de datos fuese un objeto. Más información en su página oficial.

Ventajas de Entity Framework Core

Utilizar Entity Framework tiene muchas ventajas:

  1. No tener que escribir ni una línea de código SQL.
  2. Simplicidad en el código.
  3. Mapeo de las tablas automáticamente.
  4. CRUD automático: Aquí puedes ver un ejemplo.
  5. Mejor mantenimiento de código.
  6. Consultas más «fáciles».
  7. Obliga a respetar el formato de los campos evitándonos errores e inyecciones SQL.

Desventajas de Entity Framework

No todo son ventajas y también tiene sus desventajas:

  1. Reduce el rendimiento de la consulta.
  2. Necesitas una base sólida de LINQ, aunque hoy en día todo está en StackOverflow.
  3. No te permite hacer «guarradas» concatenando el SQL. La verdad, no sé si esto es una ventaja o una desventaja.

Que necesitamos para seguir este tutorial

Durante el transcurso del tutorial realizaremos ejemplos que puedes seguir si tienes las siguientes herramientas:

  • Visual Studio: Puedes descargarlo de aquí, en este tutorial utilizaremos la versión Comunity 2019.
  • SQL Server Developer: Puedes descargarlo aquí, en este tutorial utilizaremos la versión SQL Server 2019 Developer.
  • SQL Server Management Studio: Puedes descargarlo aquí, lo utilizaremos para visualizar los datos de la BD y importar la de ejemplo.
  • Una base de datos para pruebas: Puedes crear una base de datos tu mismo para realizar las pruebas, sin embargo, te recomiendo que descargues y utilices la misma que usaré yo para que puedas seguir el tutorial mejor.

Creación de la base de datos de ejemplo

Para tener una base de datos con datos y hacer pruebas utilizaremos unas que pone a disposición el propio Microsoft, son estás.

Simplemente debes descargarte la que sirva para tu versión de SQL Server, por ejemplo, la mía es la 2019 pues me descargaré la AdventureWorks2019.bak. Una vez descarga guardatela en un directorio cercano a la raíz para encontrarla más rápido, en mi caso la guardaré en «E:\DB\».

Abrimos SQL Server e iniciamos sesión con las credenciales que configuraste durante la instalación de SQL Server, hacemos click derecho sobre «Databases->Restore Database».

En source especificamos Device y buscamos la base de datos que nos hemos descargado pulsamos en OK y si todo va bien ya tenemos nuestra base de datos «AdventureWorks2019» creada.

Más información, sobre restaurar backups.

Instalando Entity Framework Core

Creación del proyecto en Visual Studio

Si todo ha ido bien ya deberías de tener una base de datos donde podrás realizar las pruebas de este tutorial de Entity Framework Core.

A continuación, vamos a crear una aplicación de consola donde crearemos las funciones que utilizaremos para los diferentes procedimientos, eres libre de utilizar otro proyecto con interfaz gráfica si lo crees más interesante.

Abrimos Visual Studio y seleccionamos un proyecto de aplicación de consola (sin .Net Framework).

Tutorial Entity Framework Core 1

Escoge la ubicación que desees y para evitar problemas te recomiendo ponerle el mismo nombre de proyecto y de solución: «EntityFrameworkEjemplo«.

Tutorial Entity Framework Core 2

Como plataforma de destino escogemos .Net 5.0.

Tutorial Entity Framework Core 3

Instalación paquete Entity Framework Core

Hacemos clic derecho sobre el proyecto EntityFrameworkEjemplo y seleccionamos administrar paquetes NuGet.

Pulsamos en examinar y debemos de instalar los siguientes paquetes:

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools

Generando el Context de Entity Framework

El Context es una clase que contiene la estructura de tablas de nuestra aplicación y la conection String de nuestra base de datos. Gracias a este Context realizaremos todos los procedimientos sobre nuestra base de datos.

Para realizar la autentificación a la base de datos podemos utilizar dos formas, mediante usuario y contraseña o mediante autentificación de Windows, en mi caso utilizaré autentificación de Windows pero tu puedes utilizar la que quieras.

Autentificación con Windows

Scaffold-DbContext "Server=InstanciaSqlServer;Database=AdventureWorks2019;Integrated Security=true;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir "Context" -OutputDir "Models"
Lenguaje del código: C# (cs)

Autentificación con usuario y contraseña

Simplemente debes de sustituir usuario y contraseña por las que use tu SQL Server.

Scaffold-DbContext "Server=InstanciaSqlServer;Database=AdventureWorks2019;User Id=usuario;Password=contraseña;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir "Context" -OutputDir "Models"
Lenguaje del código: C# (cs)

Si no has recibido ningún error ya tendrás creado en tu proyecto dos directorios uno que es «Context» que es la librería que utilizaremos para realizar la conexión a la base de datos y «Models» que son todas las tablas de nuestra base de datos creadas como clases.

Aquí puedes ver como realmente Entity Framework ahorra una gran cantidad de tiempo, imagínate crear todas las tablas como clases C# manualmente…

Parametros interesantes Scaffold-DbContext

Existen una gran cantidad de paremetros que puedes utilizar con el Scaffold-DbContext a continuación te comento los más interesantes:

  • -Tables «tabla1″,»tabla2″,»tabla3»: Nos sirve para que EntityFramework no mapee todas las tablas de nuestra base de datos, por ejemplo, si de nuestra base de datos solo quisiéramos las direcciones podríamos haber hecho -Tables «Addresses»,»AddressTypes».
  • -Force: Nos sirve para forzar la creación del Context en caso de que ya exista uno y queramos machacarlo, por ejemplo el caso de que hayamos utilizado el comando Tables y queramos añadir más no nos dejará y tendremos que forzarlo.
  • -ContextDir «Nombre directorio»: Especificamos el directorio donde se guardará el Context, de no hacerlo lo guarda en la raíz del proyecto.
  • -OutputDir «Nombre directorio: Especificamos el directorio donde se guardarán los modelos de la base de datos, si no lo hacemos los guarda en la raíz del proyecto.

Ahora ya podemos comenzar a realizar pruebas con Entity Framework así que vamos a ello.

Select con Entity Framework

A partir de ahora todas las pruebas las realizaremos con el Program.cs, simplemente reemplaza todo el código de tu Program.cs por el del ejemplo.

using EntityFrameworkEjemplo.Context; using System; using System.Linq; namespace EntityFrameworkEjemplo { class Program { static void Main(string[] args) { EntityFrameworkSelect(); } static void EntityFrameworkSelect() { //Instanciamos nuestro context using var context = new AdventureWorks2019Context(); var phones = context.PersonPhones; //Bucle para recorrer los telefonos foreach (var phone in phones) { Console.WriteLine(phone.PhoneNumber); } } } }
Lenguaje del código: C# (cs)

El código creo que es bastante simple, la parte que pone context.PersonPhones básicamente nos hace el select, después en el bucle el phone es cada registro que devuelva el select, podemos acceder a cualquier columna escribiendo phone.nombreColumna.

Para hacer un Where utilizamos Linq, imaginemos que queremos listar todos los teléfonos del trabajo, si miras mediante SQL Server la tabla «PhoneNumberType» verás que los del trabajo son los que tienen el TypeId = 3.

Por lo que simplemente deberíamos hacer un Where así:

using EntityFrameworkEjemplo.Context; using System; using System.Linq; namespace EntityFrameworkEjemplo { class Program { static void Main(string[] args) { EntityFrameworkSelect(); } static void EntityFrameworkSelect() { //Instanciamos nuestro context using var context = new AdventureWorks2019Context(); var phones = context.PersonPhones.Where(p => p.PhoneNumberTypeId == 3); //Bucle para recorrer los telefonos foreach (var phone in phones) { Console.WriteLine(phone.PhoneNumber); } } } }
Lenguaje del código: C# (cs)

Utilizando LINQ puedes filtrar de cualquier forma que se te ocurra.

Insert con Entity Framework

Para realizar un Insert con Entity Framework core simplemente debemos enviarle un objeto con los datos de la siguiente forma:

using EntityFrameworkEjemplo.Context; using EntityFrameworkEjemplo.Models; using System; using System.Linq; namespace EntityFrameworkEjemplo { class Program { static void Main(string[] args) { InsertPhone("931 111 112"); EntityFrameworkSelect(); } static void InsertPhone(string phone) { //Instanciamos nuestro context using var context = new AdventureWorks2019Context(); //Creamos el objeto que insertaremos en la BD PersonPhone newPhone = new(); newPhone.PhoneNumber = phone; newPhone.PhoneNumberTypeId = 2; newPhone.BusinessEntityId = 1; //Agregamos nuestro registro al context context.PersonPhones.Add(newPhone); //Guardamos los registros en la base de datos. context.SaveChanges(); } static void EntityFrameworkSelect() { //Instanciamos nuestro context using var context = new AdventureWorks2019Context(); var phones = context.PersonPhones.Where(p => p.BusinessEntityId ==1); //Bucle para recorrer los telefonos foreach (var phone in phones) { Console.WriteLine(phone.PhoneNumber); } } } }
Lenguaje del código: C# (cs)

En este caso el registro no se inserta a la base de datos hasta que realizamos el contex.SaveChanges() así que no te lo olvides (pasa más de lo que crees). Lo más interesante es que tu puedes realizar tantos Add como quieras al context y te los guardará todos al realizar el SaveChanges.

Update con Entity Framwork

Para realizar el Update con Entity Framework primero debemos encontrar el registro para ello utilizamos .FirstOrDefault o .First, si utilizas .First te dará una excepción y si utilizas FirstOrDefault te devolverá null en caso de no encontrar el registro.

using EntityFrameworkEjemplo.Context; using EntityFrameworkEjemplo.Models; using System; using System.Linq; namespace EntityFrameworkEjemplo { class Program { static void Main(string[] args) { UpdatePhone("931 111 112", 1); EntityFrameworkSelect(); } static void UpdatePhone(string phoneNumber, int phoneType) { //Instanciamos nuestro context using var context = new AdventureWorks2019Context(); //Buscamos el phone que vamos a modificar en nuestra BD var phone = context.PersonPhones.FirstOrDefault(p => p.PhoneNumber == phoneNumber); //Comprobamos si se encontro algun telefono con el número "931 111 112" if (phone != null) { //Modificamos el tipo de telefono, podriamos modificar cualquier campo... phone.PhoneNumberTypeId = phoneType; // Guardamos los cambios en la BD context.SaveChanges(); } else { // No se encontro en la BD } } static void EntityFrameworkSelect() { //Instanciamos nuestro context using var context = new AdventureWorks2019Context(); var phones = context.PersonPhones.Where(p => p.BusinessEntityId ==1); //Bucle para recorrer los telefonos foreach (var phone in phones) { Console.WriteLine(phone.PhoneNumber + "-" + phone.PhoneNumberTypeId); } } } }
Lenguaje del código: C# (cs)

Delete con Entity Framework

Para acabar veamos como podemos eliminar un registro con Entity Framework, tan simple como hacerlo de la siguiente forma:

using EntityFrameworkEjemplo.Context; using EntityFrameworkEjemplo.Models; using System; using System.Linq; namespace EntityFrameworkEjemplo { class Program { static void Main(string[] args) { DeletePhone("931 111 111"); EntityFrameworkSelect(); } static void DeletePhone(string phoneNumber) { //Instanciamos nuestro context using var context = new AdventureWorks2019Context(); //Buscamos el phone que vamos a modificar en nuestra BD var phone = context.PersonPhones.FirstOrDefault(p => p.PhoneNumber == phoneNumber); //Comprobamos si se encontro algun telefono con el número "931 111 112" if (phone != null) { //Eliminamos el registro context.PersonPhones.Remove(phone); // Guardamos los cambios en la BD context.SaveChanges(); } else { // No se encontro en la BD } } static void EntityFrameworkSelect() { //Instanciamos nuestro context using var context = new AdventureWorks2019Context(); var phones = context.PersonPhones.Where(p => p.BusinessEntityId ==1); //Bucle para recorrer los telefonos foreach (var phone in phones) { Console.WriteLine(phone.PhoneNumber + "-" + phone.PhoneNumberTypeId); } } } }
Lenguaje del código: C# (cs)

Deja un comentario