Un vistazo rápido a Entity Framework 6

Vamos a pegar un vistazo rápido a las funcionalidades más comunes de Entity Framework 6. Los que venimos de utilizar LINQ pues tenemos que adaptarnos un poco, pero tampoco es mucho y a la larga es mejor trabajar con EF.

Crear un contexto

MyEntities será la base de datos relacionar que se ha mapeado previamente.

var dbContext = new MyEntities();

Operaciones CRUD

Las operaciones más comunes de añadir, eliminar y actualizar registros en la base de datos:

Add

// ADD DATA
var std = new Autonomia()
{
Id = 99,
Nombre = "Tabarnia"
};
dbContext.Autonomia.Add(std);
dbContext.SaveChanges();

Update

// UPDATE DATA
var std = dbContext.Autonomia.Find(99);
std.Nombre = "Tabarnia República";
dbContext.SaveChanges();

Remove

 // REMOVE DATA
var std = dbContext.Autonomia.Find(99);
dbContext.Autonomia.Remove(std);
dbContext.SaveChanges();

Tipos de carga de datos

Carga Explicita (Explicit Loading)

La podemos hacer de dos formas, con el método Load() y con el método Query(). Ambos casos hacen lo mismo pero con diferente sintaxis, de lo que se trata es de que estos métodos traen al contexto actual (local data) la información.

// EXPLICIT LOADING
// 1 - LOAD
var provs = dbContext.Provincia.Where(x => x.Id == 8).FirstOrDefault();
 
dbContext.Entry(provs).Reference(s => s.Autonomia).Load(); // loads Autonomia
dbContext.Entry(provs).Collection(s => s.Municipio).Load(); // loads Municipio collection 
 
foreach (var municipio in dbContext.Municipio.Local)
{
	Console.WriteLine(municipio.Nombre + " (" + municipio.Provincia.Nombre + ")");
}
 
// 2- QUERY
var provs2 = dbContext.Provincia.Where(x => x.Id == 8).FirstOrDefault();
 
dbContext.Entry(provs2)
.Collection(s => s.Municipio)
.Query()
.ToList();
 
foreach (var municipio in dbContext.Municipio.Local)
{
	Console.WriteLine(municipio.Nombre + " (" + municipio.Provincia.Nombre + ")");
}

Carga Perezosa (Lazy Load)

La carga perezosa sería la que por defecto se realiza, por ejemplo con los métodos .ToList() o .ToArray()

Carga Ansiosa (Eager Loading)

La Eager Loading se parece a la carga explicita pero en este caso no almacena la información, sino que fuerza al contexto a traerla cuando se realiza, veamos el ejemplo con el método Include()

// INCLUDE: optimización rendimiento, se trae información (Eager loading)
var autonomiaList = dbContext.Autonomia
	.Include("Provincia")
	.Where(x => x.Id == 8)
	.FirstOrDefault();
foreach (var a in autonomiaList.Provincia)
{
	Console.WriteLine(a.Nombre);
}
 
// lambda expresion necesita -> using System.Data.Entity
var autonomiaList = dbContext.Autonomia
	.Include(p => p.Provincia)
	.Where(x => x.Id == 8)
	.FirstOrDefault();
foreach (var a in autonomiaList.Provincia)
{
	Console.WriteLine(a.Nombre);
}

Carga Directa (Raw Loading)

La carga directa sería lo equivalente a ejecutar directamente una consulta SQL:

// SQLQUERY: native SQL
var auto = dbContext.Autonomia.SqlQuery("Select Id, Nombre From Maestros.Autonomia Where Id = 8").FirstOrDefault();
Console.WriteLine(auto.Nombre);
 
var automiasList = dbContext.Autonomia
			.SqlQuery("Select * from Maestros.Autonomia")
			.ToList();
foreach (var a in automiasList)
{
	Console.WriteLine(a.Nombre);
}

Validaciones controladas (try/catch)

Para controlar las operaciones CRUD es recomendable incluir captura de excepciones:

// VALIDACIONES
try
{
 
	dbContext.Autonomia.Add(new Autonomia() { Id = 99 });
 
	dbContext.SaveChanges();
 
}
catch (DbEntityValidationException dbEx) // Requiere using System.Data.Entity.Validation;
{
	foreach (DbEntityValidationResult entityErr in dbEx.EntityValidationErrors)
	{
		foreach (DbValidationError error in entityErr.ValidationErrors)
		{
			Console.WriteLine("Error Property Name {0} : Error Message: {1}",
								error.PropertyName, error.ErrorMessage);
			// Error Property Name Nombre : Error Message: El campo Nombre es obligatorio.
		}
	}
}

Transacciones

Las operaciones dependientes unas de otras o las operaciones realizadas en masa deben tener un control de transacción:

using (DbContextTransaction transaction = dbContext.Database.BeginTransaction())
{
	try
	{
		var autonomia = dbContext.Autonomia.Add(new Autonomia() { Id = 99 });
		dbContext.SaveChanges();
		transaction.Commit();
	}
	catch (Exception ex)
	{
		transaction.Rollback();
		Console.WriteLine("Error occurred.");
	}
}

Métodos útiles

Find

Realizar una búsqueda por PK

// FIND: busca por PK
var autonomiaList = dbContext.Autonomia
	.Find(8);
 
foreach (var a in autonomiaList.Provincia)
{
	Console.WriteLine(a.Nombre);
}

Log

Se puede captura el log que dejan las operaciones mediante:

dbContext.Database.Log = Console.Write;// Muestra log

Bibliografía

Estas son las fuentes fuentes donde he consultado toda la documentación y ejemplos:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *