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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在单个方法中更新两个表?相关的知识,希望对你有一定的参考价值。

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

表:汽车

  • public int Id
  • 公共字符串Reg
  • public string Make
  • 公共字符串模型

表:预订

  • public int Id
  • public DateTime BookingStart
  • public DateTime BookingEnd
  • public 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));
}

这种方法的问题在于Booking Id是从Car Id引用的。所以它不会起作用。任何人都可以帮助更好地处理这种情况吗?

答案

对于这种情况,您有2种解决方案。

解决方案1:编写一个SQL语句,直接更新数据库,而无需通过UnitOfWork。我不推荐这种方式,因为这种情况不是那么特别。你的UnitOfWork应该处理这个问题。

解决方案2:

第1步:在UnitOfWork内部尝试获取新添加的Car Id。 第2步:使用您的车辆ID更新您的预订对象。 示例代码:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateBooking([DataSourceRequest] DataSourceRequest request, Car car, Booking booking, CarBookings vm)
{
    int carId = unitOfWork.CarRepository.Update(car);
    booking.Car_Id = carId;
    unitOfWork.BookingRepository.Update(booking);
    unitOfWork.Save();
    return Json(new[] { vm }.ToDataSourceResult(request, ModelState));
}

因为您问我如何仅更新已更改的数据。我会告诉你这样做的步骤。

第1步:从UnitOfWork获取对象。 第2步:更新已更新的属性。 示例代码:在此示例中,updatesBooking是仅包含要更新的字段(具有新值的字段)的对象,如果它的字段可以为null,则为某些对象,bookInDb是当前数据库中的对象(包含旧值)。

public void UpdateBooking(Booking updatingBooking)
{
    **INIT UNIT OF WORK**
    Booking bookingInDb=unitOfWork.BookingRepository.Find(updatingBooking.Id); 
    //updatingBooking.Id might be null, you need to pass the Id of the row you want to update
    bookingInDb.BookingStart=updatingBooking.BookingStart;
    //We update only BookingStart but not BookingEnd or Car_Id
    unitOfWork.BookingRepository.Update(bookingInDb);
    unitOfWork.Save();
}

以上是关于如何在单个方法中更新两个表?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL,一次查询更新多个表

如何在按下单个片段的手动后退按钮时返回上一个片段?

oracle 如何实现对单个表批量更新

小程序各种功能代码片段整理---持续更新

如何以编程方式通过 Main Activity 在 ViewPager 中更新刷新片段

Oracle 使用单个查询更新和更改两个表中的少量列记录