Обновление сущности со страницы ASP.NET MVC с сообщением об изменении действия - PullRequest
1 голос
/ 15 марта 2010

Моя форма содержит подмножество свойств объекта «Клиент», а также скрытое поле, содержащее идентификатор клиента. Сам клиентский объект предоставляется с помощью действия 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 находится в состоянии« Добавлен ». Изменения могут применяться только тогда, когда существующий объект находится в неизмененном или измененном состоянии».

Ответы [ 3 ]

1 голос
/ 15 марта 2010

Если вы отправляете свои идентификаторы EntityKey и просто хотите сохранить опубликованные значения, все, что вам нужно:

edmx.Clients.Attach(client);
edmx.SaveChanges();
0 голосов
/ 26 февраля 2013

Вы можете использовать TryUpdateModel () примерно так ...

 [HttpPost]
    public ActionResult Edit(int id, FormCollection collection)
    {
        using (var context = new DocInvoiceEntities())
        {
            var client = context.Clients.Single(u => u.ID == id);

            if (TryUpdateModel(client))
            {
                context.SaveChanges();
                return RedirectToAction("Index");
            }
        }

        return View();
    }
0 голосов
/ 15 марта 2010

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

Короче говоря, магия SaveChanges работает только с объектами сущностей, которые были созданы из контекста, с которым вы работаете. Объекты сущностей, созданные контроллером, не соответствуют требованиям.

Попробуйте что-то вроде этого (MVC 2 и EF 4)

[HttpPost]
public ActionResult Edit(Client clientToEdit)
{
    db.Client.Attach(db.Client.Single(c => c.ID == clientToEdit.ID));
    db.Client.ApplyCurrentValues(clientToEdit);
    db.SaveChanges();
}

Для обновления требуется запрос, но я не нашел надежного способа его обойти. д

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