如何在一个方法中更新两个表?

我的 MVC 应用程序中有一个 KendoUI 网格。网格通过我的 SQL 数据库中的视图显示相关数据。它显示的两个表是CarsBookings

表:汽车

  • 公共整数 ID

  • 公共字符串 Reg

  • 公共字符串制作

  • 公共字符串模型

表:预订

  • 公共整数 ID

  • 公共日期时间预订开始

  • 公共日期时间预订结束

  • 公共 int Car_Id

网格的代码如下:

@(Html.Kendo().Grid<MyProject.ViewModels.CarBookings>()

.Name("Bookings")

.Columns(columns => {

    columns.Bound(c => c.Id);

    columns.Bound(c => c.Car_Id);

    columns.Bound(c => c.Reg);

    columns.Bound(c => c.Make);

    columns.Bound(c => c.Model);

    columns.Bound(c => c.BookingStart).Format("{0:dd/MM/yyyy}");

    columns.Bound(c => c.BookingEnd).Format("{0:dd/MM/yyyy}");

    columns.Command(command => { command.Edit(); }).Width(250);

})

.Pageable()

.Sortable()

.Groupable()

.Editable(editable => editable.Mode(GridEditMode.InLine))

.DataSource(dataSource => dataSource

    .Ajax()

    .Model(model => {

        model.Id(p => p.Id);

        model.Field(p => p.Id).Editable(false);

        model.Field(p => p.Car_Id).Editable(false);

    })

    .Read(read => read.Action("GetBookings", "Bookings"))

        .Update(update => update.Action("UpdateBooking", "Booking")))

))

我们允许用户利用网格的内联编辑功能并更新详细信息。我的问题是这些细节实际上来自两个表,所以当他们来保存这些更改时,我需要一种方法来用用户更改的数据更新这两个表。


这是UpdateBooking一种非常粗略地尝试更新两个表的方法。


[AcceptVerbs(HttpVerbs.Post)]

public ActionResult UpdateBooking([DataSourceRequest] DataSourceRequest request, Car car, Booking booking, CarBookings vm)

{

    unitOfWork.CarRepository.Update(car);

    unitOfWork.BookingRepository.Update(booking);

    unitOfWork.Save();

    return Json(new[] { vm }.ToDataSourceResult(request, ModelState));

}

这种方法的问题在于BookingId 是从CarId引用的。所以这是行不通的。任何人都可以提供更好的方法来处理这种情况吗?


慕姐4208626
浏览 222回答 1
1回答

翻过高山走不出你

对于这种情况,您有 2 种解决方案。解决方案 1:编写一个 SQL 语句,无需通过 UnitOfWork 即可直接更新您的数据库。我不推荐这种方式,因为这种情况并没有那么特殊。你的 UnitOfWork应该处理这个。解决方案2:第 1 步:在您的 UnitOfWork 中尝试获取新添加的汽车 ID。第 2 步:使用您的汽车 ID 更新您的 Booking 对象。示例代码:[AcceptVerbs(HttpVerbs.Post)]public ActionResult UpdateBooking([DataSourceRequest] DataSourceRequest request, Car car, Booking booking, CarBookings vm){&nbsp; &nbsp; int carId = unitOfWork.CarRepository.Update(car);&nbsp; &nbsp; booking.Car_Id = carId;&nbsp; &nbsp; unitOfWork.BookingRepository.Update(booking);&nbsp; &nbsp; unitOfWork.Save();&nbsp; &nbsp; return Json(new[] { vm }.ToDataSourceResult(request, ModelState));}由于您问我如何仅更新已更改的数据。我会给你步骤来做到这一点。第 1 步:从 UnitOfWork 中获取对象。第 2 步:更新已更新的属性。示例代码:在此示例中,updateBooking 是仅包含要更新的字段(具有新值的字段)的对象,如果其字段可以为空,则 bookInDb 是当前数据库中的对象(包含旧值)。public void UpdateBooking(Booking updatingBooking){&nbsp; &nbsp; **INIT UNIT OF WORK**&nbsp; &nbsp; Booking bookingInDb=unitOfWork.BookingRepository.Find(updatingBooking.Id);&nbsp;&nbsp; &nbsp; //updatingBooking.Id might be null, you need to pass the Id of the row you want to update&nbsp; &nbsp; bookingInDb.BookingStart=updatingBooking.BookingStart;&nbsp; &nbsp; //We update only BookingStart but not BookingEnd or Car_Id&nbsp; &nbsp; unitOfWork.BookingRepository.Update(bookingInDb);&nbsp; &nbsp; unitOfWork.Save();}
打开App,查看更多内容
随时随地看视频慕课网APP