Обновление отключенного объекта LINQ с помощью MVC Framework RC1 - PullRequest
5 голосов
/ 04 февраля 2009

Это немного, но у меня есть объект customer, возвращающийся к моему контроллеру. Я хочу просто переподключить этот объект обратно к базе данных, это вообще возможно? Я знаю, что есть datacontext.customers.insertonsubmit (клиент), но есть ли эквивалент datacontext.customers.updateonsubmit (клиент) ???

Ответы [ 3 ]

5 голосов
/ 04 февраля 2009

Это то, что мне не нравится в LINQ-to-SQL.

Обычно это нормально работает, если вы запрашиваете и обновляете в одной и той же области, но если вы получаете объект, кэшируете его, а затем пытаетесь обновить его позже, вы не можете.

Вот что написано в документации:

Используйте методы Attach с объектами, которые были созданы в одном DataContext и сериализованы клиенту, а затем десериализованы обратно с намерением выполнить операцию обновления или удаления. Поскольку новый DataContext не может отследить, какие исходные значения были для отключенного объекта, клиент отвечает за предоставление этих значений. В этой версии Attach предполагается, что объект находится в исходном состоянии значения. После вызова этого метода вы можете обновить его поля, например, с помощью дополнительных данных, отправленных клиентом.

Не пытайтесь присоединить объект, который не был отсоединен посредством сериализации. Объекты, которые не были сериализованы, по-прежнему поддерживают ассоциации с отложенными загрузчиками, которые могут привести к неожиданным результатам, если объект отслеживается вторым контекстом данных.

Немного двусмысленно, ИМХО, в частности, о том, что именно означает "сериализовано" и "десериализовано".

Также, что интересно, вот что говорится об объекте DataContext:

В общем случае экземпляр DataContext рассчитан на одну единицу работа "однако ваше приложение определяет этот термин. DataContext - это легкий и не дорогой Создайте. Типичный LINQ to SQL приложение создает DataContext экземпляры в области видимости метода или как член недолговечных классов, которые представляют собой логический набор связанных операции с базой данных.

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

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

3 голосов
/ 04 февраля 2009

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

Я бы порекомендовал использовать метод TryUpdateModel, в вашем действии вам нужно будет снова получить клиента из базы данных и обновить его с помощью переменных записи формы.

public ActionResult MySaveAction(int id, FormCollection form)
{
    Customer updateCustomer = _Repository.GetCustomer(id);

    TryUpdateModel(updateCustomer, "Customer", form);

    _Repository.Save(updateCustomer);
}

Вы, конечно, должны будете добавить все свои собственные обработки и проверку исключений, но это общая идея.

0 голосов
/ 04 февраля 2009

Вы хотите использовать метод присоединения к таблице клиентов в контексте данных.

datacontext.customers.Attach(customer);

для повторного подключения к контексту данных. Затем вы можете использовать SubmitChanges() для обновления значений в базе данных.

РЕДАКТИРОВАТЬ : Это работает только с объектами, которые были отделены от исходного контекста данных посредством сериализации. Если вы не возражаете против дополнительного вызова базы данных, вы можете использовать идиоматический метод в ASP.NET MVC для повторного извлечения объекта и применения ваших изменений через UpdateModel или TryUpdateModel, как подсказывает @Odd.

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