ASP.NET Core MVC 1.3 Web API Entity Framework, я не могу выполнять поиск в базе данных по имени, но я могу по идентификатору

#c# #.net #asp.net-mvc #entity-framework

#c# #.net #asp.net-mvc #entity-framework

Вопрос:

Я абсолютный новичок в .NET и я не могу это исправить.

В настоящее время у меня есть это:

Hotel.cs (модель)

 using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Hotels.Models
{
    public class Hotel
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string name { get; set; }

        [Required]
        public string city { get; set; }

        [Required]
        public string image { get; set; }

        [Required]
        public string category { get; set; }

        [Required]
        public string description { get; set; }
        [Required]
        public string features { get; set; }
        public bool featured {get; set; }
    }
}
  

Затем в моем контроллере у меня есть функция, которая выполняет поиск отеля по его идентификатору

 [HttpGet("{id}",Name="GetHotelById")]
public ActionResult<HotelReadDto> GetHotelById(int id)
{
    var hotelItem = _repository.GetHotelById(id);

    if(hotelItem != null)
    {
        return Ok(_mapper.Map<HotelReadDto>(hotelItem));
    }
    
    return NotFound();
}
  

Функции определены в этом интерфейсе:

 using System.Collections.Generic;
using Hotels.Models;

namespace Hotels.Data
{
    public interface IHotelsRepo
    {
        bool SaveChanges();
        IEnumerable<Hotel> GetAllHotels();
        Hotel GetHotelById(int id);
        void UpdateHotel(Hotel cmd);
    }
}
  

И именно здесь реализован интерфейс

   public Hotel GetHotelById(int id)
  {
       return _context.Hotels.FirstOrDefault(p => p.Id == id);
  }
  

Прямо сейчас, если я выполняю поиск по идентификатору, например

 GET /api/hotels/1
  

он возвращает значение.

Если во всех вышеперечисленных функциях я изменяю (int id), по (string name) и последнему, я ищу

 GET /api/hotels/hotel1
  

Он всегда возвращает 404.

Это то, что я в основном изменяю

Контроллер

 public ActionResult<HotelReadDto> GetHotelById(string name)
{
    var hotelItem = _repository.GetHotelById(string name);

    if (hotelItem != null)
    {
        return Ok(_mapper.Map<HotelReadDto>(hotelItem));
    }

    return NotFound();
}
  

Интерфейс

 Hotel GetHotelById(string name);
  

И затем репозиторий

 public Hotel GetHotelById(string name)
{
    return _context.Hotels.FirstOrDefault(p => p.name == name);
}
  

Но он по-прежнему возвращает 404, я немного запутался, как я мог бы изменить его, чтобы искать name вместо id

Комментарии:

1. Ваше приложение вызывает правильный URL? 404 означает, что API не был найден. Вероятно, проблема с конфигурацией. Не так много с вашим кодом… Проверьте, запущен ли ваш API. Проверьте правильность конфигурации / env.

Ответ №1:

Является ли атрибут над методом по-прежнему следующим?

 [HttpGet("{id}",Name="GetHotelById")]
public ActionResult<HotelReadDto> GetHotelById(string name)
  

Если да, попробуйте изменить его на это:

 [HttpGet("{name}",Name="GetHotelById")]
public ActionResult<HotelReadDto> GetHotelById(string name)
  

Ответ №2:

Вы должны поместить атрибут конфигурации маршрута в метод действия или вам нужно изменить маршрут в конфигурации маршрута.