【问题标题】:How do I update two tables in a single method?如何在一个方法中更新两个表?
【发布时间】:2018-08-31 08:41:15
【问题描述】:

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

表格:汽车

  • 公共 int ID
  • 公共字符串注册
  • 公共字符串制作
  • 公共字符串模型

表格:预订

  • 公共 int ID
  • public DateTime BookingStart
  • public DateTime BookingEnd
  • 公共 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 引用的。所以这行不通。任何人都可以提供更好的方法来处理这种情况吗?

【问题讨论】:

    标签: c# model-view-controller kendo-ui


    【解决方案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)
    {
        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 步: 更新已更新的属性。
    示例代码:在本例中,updatedBooking 是只包含要更新的字段(具有新值的字段)的对象,如果它的字段可以为 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();
    }
    

    【讨论】:

    • 感谢您提供此示例@Red-Wei,有没有办法让它只更新已更改的数据?由于我没有将所有字段都拉到网格中,因此传递给控制器​​的模型包含空值,其中 DB 中实际存在值。
    • 我已经更新了答案。如果您愿意,请随时问我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多