Skip to main content

Repositorio o contexto

Métodos personalizados

Para acceder a la base de datos utilizamos Entity Framework Core estándar. Por razones de familiaridad y para evitar errores en el uso hemos sobreescrito los métodos típicos de acceso y escritura que tiene EF Core por otros nuestros más verśatiles y útiles para nuestro caso de uso.

Todos estos métodos están implementados en el repositorio de cada entidad con lo que podremos acceder a ellos fácilmente. Por ejemplo:

repo.Permissions.GetAll()

Normalmente a este concepto en EF Core se le denomina contexto. En nuestro caso hemos preferido llamarlo repo porque contexto ya significa otra cosa en el resto de la aplicación.

Referencia de los métodos

Get

Equivalente al Find de EF Core con una pequeña variación: emite una excepción de tipo NoSuchEntity cuando la clave que intentamos buscar no está en la base de datos. Aplica cualquier filtro con Where que hayamos añadido previamente.

La clave se le pasa como argumento y retorna el modelo como el método estándar Find de EF Core. Ejemplo de uso:

models.Permission perm;
try
{
perm = repo.Permissions.Get(request.Name);
}
catch (NoSuchEntity)
{
throw new RpcException(new Status(StatusCode.NotFound, ""), $"permission not found: {request.Name}");
}

Exists

Comprueba si existe en la base de datos algún registro con el ID que le estamos especificando. Esto manda la query al servidor ignorando la caché en memoria de EF Core y cualquier artifacto parecido. Aplica cualquier filtro con Where que hayamos añadido previamente.

Devuelve un booleano sin dar ninguna excepción. Ejemplo de uso:

if (repo.Permissions.Exists('foo'))

GetAll

Devuelve directamente el listado entero de modelos que existen en la tabla de la base de datos sin paginar. Aplica cualquier filtro con Where que hayamos añadido previamente.

Devuelve el listado de modelos o una lista vacía si no hay ninguno. Ejemplo de uso:

foreach (var perm in repo.Permissions.GetAll())

Delete

Elimina un modelo de la base de datos. Tenemos que haber pedido previamente el modelo con Get o alguna query para poder pasárselo como argumento y que funcione correctamente por temas de concurrencia.

Si no existe el método continúa sin fallar. Ejemplo de uso:

repo.Permissions.Delete(perm);

Put

Guarda en la base de datos el modelo que le pasemos. Lo inserta nuevo o actualiza según si existía de antes o es totalmente nuevo. A nivel de llamarlo es totalmente indiferente.

También se le puede llamar con varios modelos al mismo tiempo. Ejemplos de uso:

// models.Permission perm;
repo.Permissions.Put(perm);

// List<models.Permission> perms;
repo.Permissions.Put(perms);

Where

Inicia una cadena de filtros en la query que mandará a la base de datos. La sintaxis es exactamente igual que en Entity Framework Core, y podemos encadenar también varias llamadas de la misma forma.

repo.Permissions.Where(s => s.DisplayName == request.Name)

GetMulti

Pide varios modelos a partir de sus claves en una sola query eficientemente. Esto es especialmente útil cuando queremos cargar el destino de una relación o varios modelos al mismo tiempo sin incurrir en varios viajes a la base de datos.

No tiene equivalencia en EF Core, puesto que es una operación que te obligan a implementar a mano de una forma bastante compleja para sacar los resultados en el mismo orden que los pedimos.

No falla si pedimos una lista vacía de claves, simplemente devuelve una lista vacía. Ejemplo de uso:

// List<string> names;
foreach (var perm in repo.Permissions.GetMulti(names))

Include

Permite cargar las entidades relacionadas como parte de la consulta. Se puede incluir varios niveles haciendo uso de ThenInclude.

No falla si la entidad no tiene configurada esa relación. Ejemplo de uso:

models.Group group;
try
{
group = repo.Groups.Include(g => g.Roles).ThenInclude(r => r.Permissions).Get('foo');
}
catch (NoSuchEntity)
{
throw new RpcException(new Status(StatusCode.NotFound, ""), $"group not found: {request.Name}");
}