异步仓储方法实现报错:无法将Task<Booking>转换为Booking
解决异步仓储方法调用的类型转换错误
嘿,这问题我熟!你碰到的Argument 1: cannot convert from 'System.Threading.Tasks.Task<Project.Models.Booking>' to Project.Models.Booking错误,根源很简单——你直接把异步方法返回的Task<Booking>对象传给了需要原始Booking类型的方法,异步方法的返回值是被Task包装过的,必须先通过await解锁才能拿到里面的实际数据。
具体修改步骤:
修正POST方法里的调用逻辑
你当前的代码直接传递了CreateBooking的返回值(一个Task<Booking>),但AddBooking需要的是实实在在的Booking实例。把这段代码拆分一下,先await拿到结果再传递:[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); // 这里先await拿到实际的Booking对象 var newBooking = await uw.Bookings.CreateBooking(booking); uw.Services.AddBooking(newBooking, inBooking.service.ServiceId); uw.Complete(); return Ok(); }(可选)优化你的仓储异步方法
你现在的CreateBooking方法里用await Task.FromResult(booking)其实有点“伪异步”,因为没有真正的异步IO操作(比如数据库的异步写入)。如果之后要对接真实的异步数据库操作,可以改成这样(假设你的Add方法是DbSet的Add,然后调用异步保存):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; ApplicationDbContext.Bookings.Add(booking); // 这里用异步保存替代Task.FromResult await ApplicationDbContext.SaveChangesAsync(); return booking; }这样才是真正的异步操作,避免浪费异步方法的设计初衷。
内容的提问来源于stack exchange,提问作者Yasmin Kamil
相关产品推荐
相关产品推荐

