The IRepositorioPartido interface and RepositorioPartido implementation provide data access operations for managing matches (partidos). Each match involves two teams: a home team (Local) and a visiting team (Visitante).
using Torneo.App.Dominio;namespace Torneo.App.Persistencia{ public interface IRepositorioPartido { public Partido AddPartido(Partido partido, int idEquipoLocal, int idEquipoVisitante); public IEnumerable<Partido> GetAllPartidos(); public Partido GetPartido(int idPartido); public Partido UpdatePartido(Partido partido, int idEquipoLocal, int idEquipoVisitante); public Partido DeletePartidos(int idPartido); public bool validateDuplicates(Partido partido, int idEquipoLocal, int idEquipoVisitante); }}
using Microsoft.EntityFrameworkCore;using Torneo.App.Dominio;namespace Torneo.App.Persistencia{ public class RepositorioPartido : IRepositorioPartido { private DataContext _dataContext = new DataContext(); // Implementation methods... }}
Throws exception with message “Partido not found” if the insert fails
Implementation (Lines 8-17)
public Partido AddPartido(Partido partido, int idEquipoLocal, int idEquipoVisitante){ var equipoLocalEncontrado = _dataContext.Equipos.Find(idEquipoLocal); var equipoVisitanteEncontrado = _dataContext.Equipos.Find(idEquipoVisitante); partido.Local = equipoLocalEncontrado ?? null; partido.Visitante = equipoVisitanteEncontrado ?? null; var partidoInsertado = _dataContext.Partidos.Add(partido); _dataContext.SaveChanges(); return partidoInsertado.Entity ?? throw new Exception("Partido not found");}
Key Features:
Validates both teams exist before association
Sets team relationships to null if teams don’t exist
Throws exception if insert fails
Usage Example:
var nuevoPartido = new Partido{ FechaHora = new DateTime(2024, 6, 15, 18, 0, 0), MarcadorLocal = 0, MarcadorVisitante = 0};try{ var partidoCreado = repositorioPartido.AddPartido( nuevoPartido, idEquipoLocal: 5, idEquipoVisitante: 8 ); Console.WriteLine($"Partido creado: {partidoCreado.Local?.Nombre} vs {partidoCreado.Visitante?.Nombre}"); Console.WriteLine($"Fecha: {partidoCreado.FechaHora}");}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}
Throws exception with message “Partido not found” if the ID doesn’t exist
Implementation (Lines 31-39)
public Partido GetPartido(int idPartido){ var partido = _dataContext.Partidos .Include(p => p.Local) .Include(p => p.Visitante) .AsNoTracking() .FirstOrDefault(p => p.Id == idPartido); return partido ?? throw new Exception("Partido not found");}
Usage Example:
try{ var partido = repositorioPartido.GetPartido(10); Console.WriteLine($"Partido #{partido.Id}"); Console.WriteLine($"Fecha: {partido.FechaHora:yyyy-MM-dd HH:mm}"); Console.WriteLine($"Local: {partido.Local?.Nombre} ({partido.MarcadorLocal})"); Console.WriteLine($"Visitante: {partido.Visitante?.Nombre} ({partido.MarcadorVisitante})");}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}
Throws exception with message “Partido not found” if the ID doesn’t exist
Implementation (Lines 40-62)
public Partido UpdatePartido(Partido partido, int idEquipoLocal, int idEquipoVisitante){ var partidoEncontrado = _dataContext.Partidos.Find(partido.Id); if (partidoEncontrado != null) { var equipoLocalEncontrado = _dataContext.Equipos.Find(idEquipoLocal); var equipoVisitanteEncontrado = _dataContext.Equipos.Find(idEquipoVisitante); partidoEncontrado.Local = equipoLocalEncontrado; partidoEncontrado.Visitante = equipoVisitanteEncontrado; partidoEncontrado.FechaHora = partido.FechaHora; partidoEncontrado.MarcadorLocal = partido.MarcadorLocal; partidoEncontrado.MarcadorVisitante = partido.MarcadorVisitante; _dataContext.SaveChanges(); } else { Console.WriteLine("No se encontró el partido"); } return partidoEncontrado ?? throw new Exception("Partido not found");}
Updated Properties:
Local - Home team
Visitante - Visiting team
FechaHora - Match date and time
MarcadorLocal - Home team score
MarcadorVisitante - Visiting team score
Usage Example:
try{ // Get existing match var partido = repositorioPartido.GetPartido(10); // Update score partido.MarcadorLocal = 2; partido.MarcadorVisitante = 1; // Update in database var partidoActualizado = repositorioPartido.UpdatePartido( partido, idEquipoLocal: partido.Local.Id, idEquipoVisitante: partido.Visitante.Id ); Console.WriteLine($"Marcador actualizado: {partidoActualizado.MarcadorLocal} - {partidoActualizado.MarcadorVisitante}");}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}
Throws exception with message “Partido not found” if the ID doesn’t exist
Implementation (Lines 64-83)
public Partido DeletePartidos(int idPartido){ var partidoEncontrado = GetPartido(idPartido); if (partidoEncontrado != null) { _dataContext.Partidos.Remove(partidoEncontrado); _dataContext.SaveChanges(); } else { Console.WriteLine("No se encontró el partido"); } return partidoEncontrado ?? throw new Exception("Partido not found");}
Usage Example:
try{ var partidoEliminado = repositorioPartido.DeletePartidos(10); Console.WriteLine($"Partido eliminado: {partidoEliminado.Local?.Nombre} vs {partidoEliminado.Visitante?.Nombre}");}catch (Exception ex){ Console.WriteLine($"Error: {ex.Message}");}
Exact duplicates: Team A (home) vs Team B (away) at same time
Reverse duplicates: Team B (home) vs Team A (away) at same time
This ensures no two teams can play each other at the same time, regardless of home/away designation.
Usage Example:
var nuevoPartido = new Partido{ FechaHora = new DateTime(2024, 6, 15, 18, 0, 0), MarcadorLocal = 0, MarcadorVisitante = 0};if (repositorioPartido.validateDuplicates(nuevoPartido, idEquipoLocal: 5, idEquipoVisitante: 8)){ Console.WriteLine("Error: Ya existe un partido entre estos equipos en esta fecha y hora");}else{ repositorioPartido.AddPartido(nuevoPartido, 5, 8); Console.WriteLine("Partido creado exitosamente");}