Mise à jour d'entité à partir de la page ASP.NET MVC avec publication de l'action d'édition

asp.net-mvc entity-framework

Question

Mon formulaire inclut un sous-ensemble de propriétés d'entité client et j'inclus également un champ masqué contenant un identifiant du client. L'entité cliente elle-même est fournie via l'action GET Edit.

Maintenant, je veux faire la mise à jour d'entité, mais jusqu'à présent, j'ai seulement essayé sans d'abord charger l'entité à partir de la base de données. Parce que l'objet client inclus dans POST Edit a tout ce dont il a besoin. Je souhaite mettre à jour uniquement les propriétés de l'entité dans le magasin de données.

J'ai porté mon application de 3,5 à 4,0 RC1 et mon code ressemble à ceci:

    [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();
        }

L'appel ApplyCurrentValues () lève cette exception: "L'objet existant dans ObjectContext est à l'état Ajouté. Les modifications ne peuvent être appliquées que lorsque l'objet existant est dans un état inchangé ou modifié."

Réponse acceptée

Si vous envoyez vos identifiants EntityKey à partir de votre et souhaitez simplement enregistrer vos valeurs publiées, il vous suffit de:

edmx.Clients.Attach(client);
edmx.SaveChanges();

Réponse populaire

Vous pouvez utiliser TryUpdateModel () comme si ...

 [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();
    }


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow