Предположим, что первичным ключом вашего класса Item является ItemId.
Предположим, ItemID для экземпляра, который вы пытаетесь обновить, равен 5.
DataContext видел исходное состояние для ItemID 5, поэтому он не позволит вам Attach ().
http://msdn.microsoft.com/en-us/library/bb300517.aspx
В этой версии Attach, сущность
предполагается, что в его первоначальном значении
государство. После вызова этого метода вы
может затем обновить свои поля, для
пример с дополнительными данными, отправленными из
клиент.
В LinqToSql есть три обычных способа обновления.
Если параметр этого метода редактирования был первоначально загружен из DataContext, то все, что вам нужно сделать, это:
public ActionResult Edit(Item item)
{
Global.DataContext.SubmitChanges();
return View(item);
}
DataContext отслеживает изменения в загруженных им объектах. Как неприятный побочный эффект, любые измененные объекты, которые были загружены DataContext, также будут обновлены. Это серьезная причина не использовать DataContext одного уровня приложения.
Если параметр для этого метода Edit был новым в вашем коде, загружен другим DataContext или передан в ваш код (другими словами, экземпляр не имеет прикрепленного DataContext), то вы можете сделать одно из следующих:
public ActionResult Edit(Item item)
{
using(MyDataContext dc = new MyDataContext())
{
//this new DataContext has never heard of my item, so I may Attach.
dc.Items.Attach(item);
//this loads the database record in behind your changes
// to allow optimistic concurrency to work.
//if you turn off the optimistic concurrency in your item class
// then you won't have to do this
dc.Refresh(item, KeepCurrentValues);
dc.SubmitChanges();
}
return View(item);
}
public ActionResult Edit(Item item)
{
original = Global.DataContext.Items.Single(x => x.ItemID = item.ItemID)
//play the changes against the original object.
original.Property1 = item.Property1;
original.Property2 = item.Property2;
Global.DataContext.SubmitChanges();
return View(item);
}
Ответив на ваш вопрос, позвольте мне повторить озабоченность, высказанную другими по поводу использования статического DataContext. Это плохая практика и идет вразрез с предполагаемым использованием Microsoft класса DataContext.
http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx
В общем случае экземпляр DataContext
рассчитан на одну единицу
работа "однако ваше приложение определяет
этот термин. DataContext - это
легкий и не дорогой
Создайте. Типичный LINQ to SQL
приложение создает DataContext
экземпляры в области видимости метода или как
член недолговечных классов, которые
представляют собой логический набор связанных
операции с базой данных.