Как избежать двойной загрузки объекта LINQ to SQL при редактировании его на веб-сайте - PullRequest
0 голосов
/ 10 апреля 2010

Я знаю, что вы все устали от этих вопросов Linq-to-Sql, но я только начинаю его использовать (никогда раньше не использовал ORM), и я уже нашел некоторые "уродливые" вещи. Я довольно привык к разработке старой школы ASP.NET Webforms, но я хочу оставить это позади и изучить новые вещи (я только начал читать книгу ASP.NET MVC и одну .NET 3.5 / 4.0).

Так что вот одна вещь, которая мне не понравилась, и я не смог найти хорошую альтернативу ей.

В большинстве примеров редактирования объекта LINQ, который я видел, объект загружается (ударяется о БД) сначала, чтобы заполнить текущие значения на странице формы. Затем пользователь изменяет некоторые поля, и когда нажимается кнопка «Сохранить», объект загружается второй раз, а затем обновляется.

Вот упрощенный пример сайта ScottGu NerdDinner.

//
// GET: /Dinners/Edit/5

[Authorize]
public ActionResult Edit(int id) {

    Dinner dinner = dinnerRepository.GetDinner(id);

    return View(new DinnerFormViewModel(dinner));
}

//
// POST: /Dinners/Edit/5

[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Edit(int id, FormCollection collection) {

    Dinner dinner = dinnerRepository.GetDinner(id);

    UpdateModel(dinner);

    dinnerRepository.Save();

    return RedirectToAction("Details", new { id=dinner.DinnerID });
}

Как вы можете видеть, объект ужин загружается два раза для каждой модификации. Если я не пропускаю что-то о кэшировании LINQ to SQL последних запрашиваемых объектов или что-то в этом роде, мне не нравится получать его дважды, когда его нужно получить только один раз, изменить и затем вернуть обратно в базу данных.

Итак, я действительно что-то упускаю? Или это действительно двойной удар по базе данных (в приведенном выше примере это не повредит, но могут быть случаи, когда получение объекта или набора объектов может быть тяжелым занятием).

Если да, то какая альтернатива, по вашему мнению, лучше всего избегать двойной загрузки объекта?

Большое спасибо, Привет! * * 1016

Ответы [ 3 ]

1 голос
/ 12 апреля 2010

Веб-приложения отключены, каждый запрос индивидуален. Каждый метод контроллера MVC представляет собой один веб-запрос, и в приведенном вами примере состояние не передается между запросами. Невозможно определить, прошло ли много времени между начальной загрузкой значений и отправкой сообщения для редактирования значений. Что, если другой пользователь удалит ужин во время между начальной загрузкой и редактированием.

Данные о состоянии могут передаваться между веб-запросами с использованием различных параметров, таких как файлы cookie и сеанс. Чтобы достичь того, что вы описываете, вам нужно будет хранить объект за рамками запроса. Это позволит избежать второго вызова «GetDinner». В ASP.NET MVC это достигается с помощью хеша TempData. Вы можете сохранить обед в этом, а затем извлечь его из этого в почтовом запросе. Это означает, что копия данных временно сохраняется в сеансе от одного запроса к другому. После этого он удаляется из сеанса.

0 голосов
/ 12 апреля 2010

Вы можете создать экземпляр сущности Dinner, заполнить свойства и затем вызвать Attach (ужин, true), чтобы передать измененную сущность, она будет обновлена ​​в базе данных.
У вас также есть контроль над набором свойств, проверенных на наличие проблем параллелизма.
Если для всех свойств объекта в конструкторе вы установили UpdateCheck «Никогда», вы можете получить ситуацию, когда при обновлении объекта запросы к базе данных не выполняются.

0 голосов
/ 10 апреля 2010

Я не думаю, что есть способ избежать этого в linq to sql ... Вам всегда нужны данные перед обновлением.

Во многих случаях это нормально, потому что записи очень редки по сравнению с чтением. Если вы обнаружите, что конкретная запись становится проблемой перфекта, вы всегда можете вернуться к использованию хранимого процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...