Как мне обновить две таблицы в одном методе? - PullRequest
0 голосов
/ 31 августа 2018

В моем приложении MVC есть сетка KendoUI. Сетка показывает связанные данные через представление в моей базе данных SQL. Две таблицы, которые он показывает: Cars и Bookings

Таблица: Автомобили

  • public int Id
  • публичная строка Reg
  • публичная строка Make
  • публичная строка Модель

Таблица: Бронирование

  • public int Id
  • общедоступный DateTime BookingStart
  • общедоступная дата и время бронированияEnd
  • 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. Так что это не сработает. Кто-нибудь может помочь с лучшим подходом к решению этого сценария?

1 Ответ

0 голосов
/ 31 августа 2018

У вас есть 2 решения для этой ситуации.

Решение 1: Напишите статистику SQL, которая будет обновлять вашу базу данных напрямую, без использования UnitOfWork. Я не рекомендую этот способ, потому что этот случай не настолько особенный, чтобы сделать это. Ваш UnitOfWork должен справиться с этим.

Решение 2:

Шаг 1: Внутри вашего UnitOfWork попытайтесь получить только что добавленный идентификатор автомобиля.
Шаг 2: Обновите объект бронирования с помощью идентификатора автомобиля.
Пример кода:

[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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...