Аргумент 1: невозможно преобразовать из 'System.Threading.Tasks.Task'Project.Models.Booking - PullRequest
0 голосов
/ 09 мая 2019

Я работаю над школьным проектом, и я пытаюсь реализовать асинхронные методы в моих классах репозитория и получил эту ошибку в моем API для POST-метода: Аргумент 1: невозможно преобразовать из 'System.Threading.Tasks. Задача "Проект. Модели. Книги.

Может кто-нибудь помочь мне решить эту ошибку?

Вот так выглядит мой метод репозитория:

    public async Task<Booking>CreateBooking(Booking inBooking) {
        Booking booking = new Booking();

        booking.BookingId = ApplicationDbContext.Bookings.Count();
        booking.UserName = inBooking.UserName;
        booking.UserMail = inBooking.UserMail;
        booking.UserMobile = inBooking.UserMobile;
        booking.Available = false;
        booking.StartTime = inBooking.StartTime;
        booking.EndTime = inBooking.EndTime;
        booking.Date = inBooking.Date;

        Add(booking);
        return await Task.FromResult(booking);
        //return booking;
    }

А вот так выглядит мой Post-метод:

 [Route("api/PostBooking")]
        [HttpPost]
        public async Task<IHttpActionResult> PostBooking(BookingSystemServiceBookingViewModel inBooking)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest("Invalid data");
            }

            var booking =  inBooking.booking;

            booking.StartTime = inBooking.startTime;
            booking.EndTime = inBooking.startTime.AddMinutes(inBooking.service.Duration);

             uw.Services.AddBooking(uw.Bookings.CreateBooking(booking), inBooking.service.ServiceId);
            uw.Complete();

            return Ok();
        }

Я получаю сообщение об ошибке по адресу: uw.Services.AddBooking (uw.Bookings.CreateBooking (резервирование), inBooking.service.ServiceId); `

1 Ответ

1 голос
/ 09 мая 2019

попытка реализовать асинхронные методы в моих классах репозитория

Лучший способ сделать вещи асинхронными - это не "извне".То есть вы не хотите начинать с действия контроллера и говорить «как я могу сделать это асинхронным?».Вместо этого вы хотите начать с API самого низкого уровня и сказать «это должно быть асинхронно» (т. Е. Оно основано на вводе / выводе) и позволить оттуда расти асинхронности.

Если Add на самом делевставляет ли база данных, тогда это будет первый метод, который будет сделан асинхронным.Затем вы await ваш AddAsync метод, и асинхронность возрастает с AddAsync до CreateBookingAsync:

public async Task<Booking> CreateBookingAsync(Booking inBooking) {
  Booking booking = new Booking();

  ...

  await AddAsync(booking);
  return booking;
}

[Route("api/PostBooking")]
[HttpPost]
public async Task<IHttpActionResult> PostBooking(BookingSystemServiceBookingViewModel inBooking)
{
  ...

  uw.Services.AddBooking(await uw.Bookings.CreateBookingAsync(booking), inBooking.service.ServiceId);
  uw.Complete();

  return Ok();
}

Если, с другой стороны, это метод Complete, который фактически взаимодействуетс базой данных, то , что - это то, что должно быть сделано асинхронным.В этом случае Add - это просто операция в памяти, а Complete - это та, которая сохраняет все обновления базы данных.Итак, после вы конвертируете Complete в CompleteAsync, ваш код будет выглядеть так:

public Booking CreateBooking(Booking inBooking) {
  Booking booking = new Booking();

  ...

  Add(booking);
  return booking;
}

[Route("api/PostBooking")]
[HttpPost]
public async Task<IHttpActionResult> PostBooking(BookingSystemServiceBookingViewModel inBooking)
{
  ...

  uw.Services.AddBooking(uw.Bookings.CreateBooking(booking), inBooking.service.ServiceId);
  await uw.CompleteAsync();

  return Ok();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...