繁体   English   中英

参数1:无法从“ System.Threading.Tasks.Task”转换 <Project.Models.Booking> &#39;到Project.Models.Booking

[英]Argument 1: cannot convert from 'System.Threading.Tasks.Task<Project.Models.Booking>' to Project.Models.Booking

我正在学校项目上工作,并且试图在存储库类中实现异步方法,并且在POST方法的API中遇到此错误:参数1:无法从'System.Threading.Tasks.Task'转换为Project.Models.Booking。

有人可以帮我解决这个错误吗?

这是我的存储库方法的样子:

    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;
    }

这就是我的后期方法:

 [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(booking),inBooking.service.ServiceId);`

尝试在我的存储库类中实现异步方法

使事物异步的最佳方法不是“从外而内”。 也就是说,您不想从控制器动作开始就说“如何使它异步?”。 相反,您想从最低级别的API开始,说“这应该是异步的”(即,它是基于I / O的),然后让异步从那里开始。

如果Add实际上确实在数据库中插入,那么那将是第一个被异步化的方法。 然后,您将await AddAsync方法,并且异步性将从AddAsyncCreateBookingAsync

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM