public async Task MergeArenas(ArenaSessionModel source, ArenaSessionModel target) { if (source == null || target == null || source.Hero == null || target.Hero == null || source.Hero.Id != target.Hero.Id) { Log.Error("Error merging arenas, null parameters or heroes are not the same."); return; } using (var context = this.dbContext()) { var sourceArena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == source.Id); var targetArena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == target.Id); if (sourceArena == null || targetArena == null) { Log.Error("Error merging arenas, source or target does not exist"); return; } var updatedGames = new List<GameResult>(); foreach (var sourceGame in sourceArena.Games) { AddGameToArena(sourceGame, targetArena); updatedGames.Add(sourceGame); } for (int i = sourceArena.Games.Count - 1; i >= 0; i--) { sourceArena.Games.Remove(sourceArena.Games[i]); } context.ArenaSessions.Remove(sourceArena); SetEndDateIfNeeded(targetArena); await context.SaveChangesAsync(); target.MapFrom(targetArena); this.events.PublishOnBackgroundThread(new ArenaSessionDeleted(source)); this.events.PublishOnBackgroundThread(new ArenaSessionUpdated(targetArena.Id)); foreach (var game in updatedGames) { this.events.PublishOnBackgroundThread(new GameResultUpdated(game.Id, game.ArenaSessionId)); } } }