· NET  · Lectura en 9 min

C#: 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.

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. Facilidad de 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.
  4. Poca compatibilidad con cambios en la base de datos que no se hagan con su gestor de migraciones.

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).

Crear proyecto

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

Crear proyecto paso 2

Como plataforma de destino escogemos .Net 5.0.

Crear proyecto paso 2

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

Generar 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"

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"

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);                
            }
        }
    }
}

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);                
            }
        }
    }
}

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);                
            }
        }
    }
  
}

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);                
            }
        }
    }
  
}

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);                
            }
        }
    }
  
}

Para acabar el artículo, si estás pensando en comprar hosting o en comprar dominio Web, déjame recomendarte estos artículos:

    Compartir
    Volver al blog

    Artículos relacionados

    Ver todos los artículos »
    PHP include: qué es, cómo funciona y cuándo usarlo

    PHP include: qué es, cómo funciona y cuándo usarlo

    ¿Te gustaría simplificar y organizar mejor tu código PHP? ¿Quieres reutilizar el mismo código en diferentes páginas sin tener que copiarlo y pegarlo? ¿Quieres facilitar el mantenimiento y la actualización de tu sitio web? Si has respondido que sí a alguna de estas preguntas, entonces necesitas conocer la función include de PHP.