/// <summary>
        /// Verifies and stores the map in the database
        /// </summary>
        /// <param name="key">Player secret key</param>
        /// <param name="cells">Selected ship cells on the map</param>
        public void UpdateMap(string key, List <Point> cells)
        {
            var player = _entities.Players.Include(t => t.Cells).FirstOrDefault(t => t.Key == key);

            if (player == null)
            {
                throw new KeyNotFoundException("Player with key " + key + " not found.");
            }

            if (player.MapValidated)
            {
                throw new EntityValidationException("Map changes are not allowed.");
            }

            var shipMap = new ShipMap();

            shipMap.ParseShips(cells);
            shipMap.Validate();

            player.MapValidated = true;

            var newCells = cells.Select(t => new ShipCell(t.X, t.Y)
            {
                PlayerId = player.Id
            });

            _entities.ShipCells.RemoveRange(player.Cells);
            _entities.ShipCells.AddRange(newCells);

            using (var transaction = _entities.Database.BeginTransaction())
            {
                try
                {
                    _entities.SaveChanges();
                    transaction.Commit();
                }
                catch (DbEntityValidationException exception)
                {
                    transaction.Rollback();
                    throw new EntityValidationException(exception);
                }
            }
        }