Mise à jour d'un objet avec MVC3
J'ai un modèle que je peux modifier, veuillez consulter l'exemple ci-dessous: p> 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. P> Puis-je laisser EF savoir de ne pas modifier certains champs ? Merci. P> p>
3 Réponses :
Vous écrivez apparemment votre enregistrement existant avec un enregistrement incomplet. Lorsque vous utilisez la méthode ci-dessus, il remplacera complètement l'existant. P>
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. P>
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.
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 Je ferais normalement ce qui suit: p> Étape 3 est un peu fastieux envisagez donc d'utiliser un outil tel que automapper pour faciliter les choses P> EDIT: P> db.Entry (c) .state = entitystate.modifié; code> mais qui indique à la structure de l'entité que tout l'enregistrement a été mis à jour. 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);
}
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?
La réflexion n'est pas toujours mauvaise, parfois c'est votre ami: