Tak jak w temacie, co najlepiej zwracać, jeśli:
- nie zostanie znaleziony obiekt o zadanym ID?
- istnieje już obiekt o zadanym ID?
Prosiłbym o ocenę i porady odnośnie rozwiązania.
W poniższym kodzie chcę dodać wybrany Team do istniejącego już Season. Do kontrolera przychodzą ich Id, zawarte jako właściwości klasy AddSeasonTeamRequest
. Zakładam, że ktoś przesłał do API jedno z nich niepoprawne (nieistniejące w bazie).
[HttpPost]
public async Task<ActionResult> AddTeam(AddSeasonTeamRequest request)
{
var result = await seasonsService.AddTeam(request.SeasonId, request.TeamId);
if (!result)
return BadRequest();
return Ok();
}
public class Season
{
public int Id { get; private set; }
// ...
public virtual ICollection<SeasonTeam> Teams { get; set; }
public void AddTeam(Team team)
{
if (Teams.Any(t => t.TeamId == team.Id))
return; // co należałoby zwrócić? Może boolean? Niektórzy rzucają nawet wyjątki.
Teams.Add(new SeasonTeam()
{
TeamId = team.Id
});
}
}
public async Task<bool> AddTeam(int seasonId, int teamId)
{
var season = await context.Seasons
.Include(s => s.Teams)
.SingleOrDefaultAsync(i => i.Id == seasonId);
if (season == null)
return false; // co należałoby zwrócić? Może boolean? Niektórzy rzucają nawet wyjątki.
var team = await context.Teams.SingleOrDefaultAsync(i => i.Id == teamId);
if (team == null)
return false; // co należałoby zwrócić? Może boolean? Niektórzy rzucają nawet wyjątki.
season.AddTeam(team);
context.Entry(season);
await context.SaveChangesAsync();
return true;
}