如何用一个方法更新两个表?

时间:2018-08-31 08:41:15

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

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

表格:汽车

  • 公共整数ID
  • 公共字符串Reg
  • 公共字符串Make
  • 公共字符串模型

表格:预订

  • 公共整数ID
  • 公开DateTime BookingStart
  • 公开DateTime预订结束
  • 公共int Car_Id

网格的代码如下:

Bookings

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

这里是@(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)); } ID是从Booking ID引用的。所以这行不通。任何人都可以提供更好的方法来处理这种情况吗?

1 个答案:

答案 0 :(得分:1)

针对这种情况,您有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步:更新已更新的属性。
示例代码:在此示例中,updateBooking是仅包含要更新的字段(具有新值的字段)的对象,如果某些字段可以为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();
}