Моя форма содержит подмножество свойств объекта «Клиент», а также скрытое поле, содержащее идентификатор клиента. Сам клиентский объект предоставляется с помощью действия GET Edit.
Теперь я хочу обновить сущность, но до сих пор пытался без предварительной загрузки сущности из БД. Потому что клиентский объект, который входит в POST Edit, имеет все, что ему нужно. Я хочу обновить только эти свойства объекта в хранилище данных.
Я перенес свое приложение с 3.5 на 4.0 RC1, и теперь мой код выглядит так:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Client client)
{
try
{
using (DocInvoiceEntities edmx = new DocInvoiceEntities())
{
if (string.IsNullOrEmpty(client.client_firstname))
ViewData.ModelState.AddModelError("client_firstname", "Firstname!");
if (string.IsNullOrEmpty(client.client_lastname))
ViewData.ModelState.AddModelError("client_lastname", "Lastname!");
// postcode
client.PostCode = (from p in edmx.PostCodes where p.postcode.Equals(client.PostCode.postcode) select p).First();
// check for errors
if (!ViewData.ModelState.IsValid)
throw new InvalidOperationException();
// save changes to datastore
edmx.Clients.Attach(edmx.Clients.Single(c => c.client_id == client.client_id));
edmx.Clients.ApplyCurrentValues(client);
edmx.SaveChanges();
}
return RedirectToAction("Create", "Invoice");
}
catch
{
return View();
}
Вызов ApplyCurrentValues () вызывает это исключение:
«Существующий объект в ObjectContext находится в состоянии« Добавлен ». Изменения могут применяться только тогда, когда существующий объект находится в неизмененном или измененном состоянии».