Mettre à jour seulement une partie d’un modèle

J’utilise ASP.NET MVC 3 et Entity Framework Code First. J’ai une page (utilisant Razor View Engine) qui permet à un utilisateur de mettre à jour des parties d’un modèle (Product):

@ Html.LabelFor (modèle => modèle.Aperçu) @ Html.TextAreaFor (modèle => modèle.Aperçu)

@Html.LabelFor(model => model.Description) @Html.TextAreaFor(model => model.Description) @Html.HiddenFor(model => model.ProductId) 

Ma méthode de contrôleur ressemble à ceci:

 [HttpPost] public ActionResult Update(Product product) { db.Products.Attach(product); db.SaveChanges(); } 

Tout ce que je veux faire est de mettre à jour les atsortingbuts Overview et Description du modèle Product. Cependant, lorsque j’exécute le code, le modèle n’est pas mis à jour dans la firebase database et je ne reçois aucune erreur.

Lorsque j’inspecte l’object product lors du débogage, je constate que, si les champs ProductId, Overview et Description sont corrects (conformément à POST FORM), les autres champs sont des valeurs NULL (ce à quoi je m’attendrais).

Je me demande si l’état incomplet de l’object produit l’empêche de sauvegarder dans la firebase database?

Voici le modèle:

Classe publique Product {public int ProductId {get; ensemble; }

  [Required(ErrorMessage = "Please enter a description")] [DataType(DataType.MultilineText)] public ssortingng Description { get; set; } [DataType(DataType.MultilineText)] public ssortingng Overview { get; set; } public int SupplierId { get; set; } public virtual Supplier Supplier { get; set; } } 

Quand il s’agit d’éditer, essayez d’abord de sélectionner un enregistrement existant dans la firebase database (celui que vous souhaitez éditer), puis mettez-le à jour avec les valeurs collectées dans votre formulaire (c’est-à-dire le modèle transmis à l’action de votre contrôleur), puis enregistrez-le.

Par exemple

 [HttpPost] public ActionResult Update(Product productPassedInFromView) { Product productToEdit = db.Products.Find(productPassedInFromView.ID); productToEdit.Property1 = productPassedInFromView.Property1; productToEdit.Property2 = productPassedInFromView.Property2; //Continue for all the fields you want to edit. db.SaveChanges(); } 

Si vous savez quelles propriétés d’entité vous allez mettre à jour, vous pouvez utiliser ChangeTracker dans EF pour ne marquer que ces propriétés comme modifiées. Voici un exemple modifié de l’excellent livre [Programming Entity Framework: DbContext] (http://shop.oreilly.com/product/0636920022237.do):

 db.Products.Attach(product); var entry = db.Entry(product); entry.State = EntityState.Unchanged; entity.Property(p => p.Overview).IsModified = true; entity.Property(p => p.Description).IsModified = true; db.SaveChanges(); 

Cela vous fera économiser un aller-retour à la firebase database. Mais bien sûr, cela ne fonctionne que lorsque vous savez quelles propriétés changent. Il existe d’autres moyens d’y parvenir, mais celui-ci est le plus simple.