The IRepositorioPosicion interface and RepositorioPosicion implementation provide data access operations for managing player positions (e.g., Delantero, Defensa, Mediocampista, Portero). Positions are associated with players (Jugadores) in the system.
using Torneo.App.Dominio;namespace Torneo.App.Persistencia{ public interface IRepositorioPosicion { public Posicion AddPosicion(Posicion posicion); public IEnumerable<Posicion> GetAllPosiciones(); public Posicion GetPosicion(int idPosicion); public Posicion UpdatePosicion(Posicion posicion); public Posicion DeletePosicion(int idPosicion); public bool validateDuplicates(Posicion nombrePosicion); }}
using Microsoft.EntityFrameworkCore;using Torneo.App.Dominio;namespace Torneo.App.Persistencia{ public class RepositorioPosicion : IRepositorioPosicion { private DataContext _dataContext = new DataContext(); // Implementation methods... }}
The inserted Posicion entity with its generated ID
Implementation (Lines 8-13)
public Posicion AddPosicion(Posicion posicion){ var posicionInsertada = _dataContext.Posiciones.Add(posicion); _dataContext.SaveChanges(); return posicionInsertada.Entity;}
Usage Example:
var nuevaPosicion = new Posicion{ Nombre = "Delantero"};var posicionCreada = repositorioPosicion.AddPosicion(nuevaPosicion);Console.WriteLine($"Posición creada: {posicionCreada.Nombre} (ID: {posicionCreada.Id})");
Throws exception with message “Posiciones not found” if the result is null
Implementation (Lines 14-26)
public IEnumerable<Posicion> GetAllPosiciones(){ var posiciones = _dataContext.Posiciones .Include(p => p.Jugadores) .AsNoTracking() .ToList(); return posiciones ?? throw new Exception("Posiciones not found");}
Key Features:
Uses .Include(p => p.Jugadores) to eagerly load all players in each position
Uses .AsNoTracking() for improved read performance
Throws exception with message “Posicion not found” if the ID doesn’t exist
Implementation (Lines 27-31)
public Posicion GetPosicion(int idPosicion){ var posicionEncontrado = _dataContext.Posiciones.Find(idPosicion); return posicionEncontrado ?? throw new Exception("Posicion not found");}
Throws exception with message “Posicion not found” if the ID doesn’t exist
Implementation (Lines 33-40)
public Posicion UpdatePosicion(Posicion posicion){ var posicionEncontrada = GetPosicion(posicion.Id); posicionEncontrada.Nombre = posicion.Nombre; _dataContext.SaveChanges(); return posicionEncontrada ?? throw new Exception("Posicion not found");}
Updated Properties:
Nombre - Position name
Usage Example:
try{ var posicion = repositorioPosicion.GetPosicion(3); posicion.Nombre = "Delantero Centro"; var posicionActualizada = repositorioPosicion.UpdatePosicion(posicion); Console.WriteLine($"Posición actualizada: {posicionActualizada.Nombre}");}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}
Throws exception with message “Posicion not found” if the ID doesn’t exist
Implementation (Lines 42-57)
public Posicion DeletePosicion(int idPosicion){ var posicionEncontrada = GetPosicion(idPosicion); if (posicionEncontrada != null) { _dataContext.Posiciones.Remove(posicionEncontrada); _dataContext.SaveChanges(); } else { Console.WriteLine("No se encontró la posicion"); } return posicionEncontrada ?? throw new Exception("Posicion not found");}
Deleting a position will fail if it has associated players due to foreign key constraints configured with DeleteBehavior.Restrict. Remove all players from the position before deleting, or reassign them to different positions.
Usage Example:
try{ var posicionEliminada = repositorioPosicion.DeletePosicion(3); Console.WriteLine($"Posición eliminada: {posicionEliminada.Nombre}");}catch (DbUpdateException){ Console.WriteLine("No se puede eliminar: la posición tiene jugadores asociados");}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}
Excludes current position when updating (checks posicionIngresada.Id != posicion.Id)
Returns false on any exception
Usage Example:
var nuevaPosicion = new Posicion{ Nombre = "Delantero"};if (repositorioPosicion.validateDuplicates(nuevaPosicion)){ Console.WriteLine("Error: Ya existe una posición con este nombre");}else{ repositorioPosicion.AddPosicion(nuevaPosicion); Console.WriteLine("Posición creada exitosamente");}
// Create standard football positionsstring[] posicionesEstandar = { "Portero", "Defensa", "Mediocampista", "Delantero" };foreach (var nombrePosicion in posicionesEstandar){ var posicion = new Posicion { Nombre = nombrePosicion }; if (!repositorioPosicion.validateDuplicates(posicion)) { try { var resultado = repositorioPosicion.AddPosicion(posicion); Console.WriteLine($"Posición creada: {resultado.Nombre}"); } catch (Exception ex) { Console.WriteLine($"Error creando {nombrePosicion}: {ex.Message}"); } } else { Console.WriteLine($"Posición ya existe: {nombrePosicion}"); }}
Listing Positions with Player Counts
try{ var todasPosiciones = repositorioPosicion.GetAllPosiciones(); Console.WriteLine("Posiciones y cantidad de jugadores:"); Console.WriteLine("===================================\n"); foreach (var posicion in todasPosiciones.OrderBy(p => p.Nombre)) { Console.WriteLine($"{posicion.Nombre}: {posicion.Jugadores.Count()} jugadores"); } // Summary var totalJugadores = todasPosiciones.Sum(p => p.Jugadores.Count()); Console.WriteLine($"\nTotal jugadores: {totalJugadores}");}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}
Finding Positions Without Players
try{ var todasPosiciones = repositorioPosicion.GetAllPosiciones(); var posicionesSinJugadores = todasPosiciones .Where(p => !p.Jugadores.Any()) .OrderBy(p => p.Nombre) .ToList(); if (posicionesSinJugadores.Any()) { Console.WriteLine("Posiciones sin jugadores asignados:"); foreach (var posicion in posicionesSinJugadores) { Console.WriteLine($" - {posicion.Nombre} (ID: {posicion.Id})"); } } else { Console.WriteLine("Todas las posiciones tienen al menos un jugador asignado"); }}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}
Renaming a Position
try{ // Get existing position var posicion = repositorioPosicion.GetPosicion(3); Console.WriteLine($"Posición actual: {posicion.Nombre}"); // Rename posicion.Nombre = "Centrocampista"; // Rename Mediocampista // Validate new name if (!repositorioPosicion.validateDuplicates(posicion)) { var posicionActualizada = repositorioPosicion.UpdatePosicion(posicion); Console.WriteLine($"Posición renombrada a: {posicionActualizada.Nombre}"); } else { Console.WriteLine("Ya existe una posición con ese nombre"); }}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}