7
votes

MVC3 avec EF 4.1 et entitéState.Modified

Mise à jour d'un objet avec MVC3

J'ai un modèle que je peux modifier, veuillez consulter l'exemple ci-dessous: xxx

Le modèle a d'autres champs qui ne figure pas Dans la vue et ne peut pas être modifié par l'utilisateur, mais lorsque je clique sur le bouton Soumettre, les champs qui n'étaient pas affichés dans l'affichage ont été définis sur NULL.

Puis-je laisser EF savoir de ne pas modifier certains champs ? Merci.


0 commentaires

3 Réponses :


3
votes

Vous écrivez apparemment votre enregistrement existant avec un enregistrement incomplet. Lorsque vous utilisez la méthode ci-dessus, il remplacera complètement l'existant.

Vous devez soit remplir tous les champs que vous ne souhaitez pas remplacer par les valeurs existantes, ou vous devez obtenir l'enregistrement existant et modifier les champs que vous souhaitez modifier, puis enregistrez-le.


7 commentaires

Il n'existe aucun moyen de spécifier dans la classe modèle, par exemple le champ "ApplicationDate" pour ne pas permettre de modifier la valeur, de la même manière que nous ne pouvons pas modifier la clé primaire de l'entité modèle?


@ user1042528 - Vous ne comprenez pas. Vous remplacez tout le dossier, ne mettant pas à jour les champs individuels. Peu importe que vous puissiez empêcher les champs d'être écrits, puisque vous n'écrivez pas vraiment à eux. Vous remplacez tout le dossier. C'est comme la différence entre le remplacement d'une bouteille de bière dans un pack à six, et vient d'obtenir un exemple différent qui n'a qu'une bouteille. Vous ne remplacez pas les 5 autres avec rien, vous remplacez tout le dossier.


THX pour votre explication, c'est comment vous mettez à jour les champs individuels? [Httppost] Public ActionResult Modifier (Société C) {if (modelstate.isvalid) {société dbcompanyobjct = db.company.find (c.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.CompanyId); dbcompanyobjct.companyName = c.companyname; dbcompanyobjct.City = C.City; db.savechanges (); retour RedirectToaction ("Index"); } Vue de retour (C); }


Je m'excuse pour le code n'étant pas aligné, difficile à lire, aucune idée de la raison pour laquelle il ne s'aligne pas ... conseils PLZ si le code correct.


Framework entité n'écrit pas toujours la ligne entière. Il suivra les modifications apportées aux colonnes et ne fera que mettre à jour ceux qui ont changé.


Salut Martin, PLZ montre un exemple pour faire ça? Comment EF suivra-t-il les modifications et ne mettra à jour que les champs qui ont changé? Je vous remercie!


@Martinbooth - Oui, mais pas dans la façon dont l'auteur le fait. Qui est le point.



12
votes

Généralement, il est préférable de ne pas se lier à l'objet d'entité directement, plutôt de créer un modèle d'édition et de se lier à cela.

Après tout .. Quoi d'empêcher quelqu'un de poster des valeurs de retour que vous ne voulez pas changer avec cette approche? P>

Le problème principal Voici le fait que la liaison MVC modifie les propriétés du modèle avant que celle-ci dans un contexte par conséquent, le framework d'entité ne sache pas quelles valeurs ont changé (et qui devrait donc être mise à jour)

Vous avez légèrement atténué avec légèrement avec db.Entry (c) .state = entitystate.modifié; code> mais qui indique à la structure de l'entité que tout l'enregistrement a été mis à jour. P >

Je ferais normalement ce qui suit: p>

  1. lie à un modèle spécifiquement pour ce contrôleur d'abord li>
  2. Créez une instance de la classe d'entité que vous souhaitez mettre à jour, définissez l'ID en conséquence et joignez-la au contexte LI>
  3. Mettez à jour les propriétés de l'entité pour être identique au modèle que vous avez lié à (l'objet est joint et donc l'entité framework suive quelles colonnes sont modifiées maintenant) LI>
  4. SAVECHANGES LI> ol>

    Étape 3 est un peu fastieux envisagez donc d'utiliser un outil tel que automapper pour faciliter les choses P>

    EDIT: P>

        [HttpPost]
        public ActionResult Edit(Company c)
        {
            if (ModelState.IsValid)
            {
                Company dbCompayObjct = new Company { companyId = c.companyId };
                db.Company.Attach(dbCompayObjct);
    
                dbCompanyObjct.CompanyName = c.CompanyName;
                dbCompanyObjct.City = c.City;
    
                db.SaveChanges();
    
                return RedirectToAction("Index");
            } 
            return View(c);
        }
    


4 commentaires

Bonjour Martin, merci pour votre réponse, je modifie l'action de modification au code ci-dessous, pourriez-vous s'il vous plaît laissez-moi savoir s'il s'agit de ce que vous vouliez dire. Srry vient de commencer à apprendre EF et MVC [httpport] Public ActionResult Modifier (société C) {if (modelstate.isvalid) {société dbcompanyobjct = db.company.find (c.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.CompanyId); dbcompanyobjct.companyName = c.companyname; dbcompanyobjct.City = C.City; db.savechanges (); retour RedirectToaction ("Index"); } Vue de retour (C); } De plus, pourriez-vous m'expliquer ce qui est SOPAPAPPER? Comment puis-je l'utiliser? Merci


Je m'excuse pour le code n'étant pas aligné, difficile à lire, aucune idée de la raison pour laquelle il ne s'aligne pas ... conseils PLZ si le code correct.


Cela fonctionnera, je posterai une mise à jour rapide cependant pour montrer que vous n'avez pas besoin de la première trouvaille


TryupDaTemodate peut-il ne pas être utilisé ici?



0
votes

La réflexion n'est pas toujours mauvaise, parfois c'est votre ami: xxx


0 commentaires