为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕姐4208626 2021-12-25 16:21:46
我的 MVC 应用程序中有一个 KendoUI 网格。网格通过我的 SQL 数据库中的视图显示相关数据。它显示的两个表是Cars和Bookings表:汽车公共整数 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引用的。所以这是行不通的。任何人都可以提供更好的方法来处理这种情况吗?
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

对于这种情况,您有 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 步:更新已更新的属性。

示例代码:在此示例中,updateBooking 是仅包含要更新的字段(具有新值的字段)的对象,如果其字段可以为空,则 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();

}


查看完整回答
反对 回复 2021-12-25
  • 1 回答
  • 0 关注
  • 221 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信