· Andrés Ledo · NET · Lectura en 9 min
C#: Tutorial Entity Framework
Para algunos utilizar Entity Framework 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.
Índice
- Ventajas de Entity Framework
- Desventajas de Entity Framework
- Que necesitamos para seguir este tutorial
- Creación de la base de datos de ejemplo
- Instalando Entity Framework
- Select con Entity Framework
- Insert con Entity Framework
- Update con Entity Framwork
- Delete con Entity Framework
Ventajas de Entity Framework
Utilizar Entity Framework tiene muchas ventajas:
- No tener que escribir ni una línea de código SQL.
- Simplicidad en el código.
- Mapeo de las tablas automáticamente.
- CRUD automático: Aquí puedes ver un ejemplo.
- Facilidad de mantenimiento de código.
- Consultas más “fáciles”.
- 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:
- Reduce el rendimiento de la consulta.
- Necesitas una base sólida de LINQ, aunque hoy en día todo está en StackOverflow.
- No te permite hacer «guarradas» concatenando el SQL. La verdad, no sé si esto es una ventaja o una desventaja.
- 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
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).
Escoge la ubicación que desees y para evitar problemas te recomiendo ponerle el mismo nombre de proyecto y de solución: EntityFrameworkEjemplo.
Como plataforma de destino escogemos .Net 5.0.
Instalación paquete Entity Framework
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: