91 votes

Exclusion d'une propriété lors d'une mise à jour dans Entity Framework

J'ai cherché un moyen approprié de marquer une propriété pour qu'elle ne soit PAS modifiée lors de la mise à jour d'un modèle dans MVC.

Par exemple, prenons ce petit modèle :

class Model
{
    [Key]
    public Guid Id {get; set;}
    public Guid Token {get; set;}

    //... lots of properties here ...
}

alors la méthode d'édition que MVC crée ressemble à ceci :

[HttpPost]
public ActionResult Edit(Model model)
{
    if (ModelState.IsValid)
    {
        db.Entry(model).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(model);
}

Maintenant, si ma vue ne contient pas le jeton, il sera annulé par cette modification.

Je cherche quelque chose comme ça :

db.Entry(model).State = EntityState.Modified;
db.Entry(model).Property(x => x.Token).State = PropertyState.Unmodified;
db.SaveChanges();

La meilleure solution que j'ai trouvée jusqu'à présent est d'être inclusif et de définir à la main toutes les propriétés que je veux inclure, mais je ne veux vraiment dire que celles qui doivent être exclues.

0voto

Efe Zaladin Points 63

J'utilise dapper mais ma solution fonctionnera aussi pour EF. Si vous avez l'intention de changer d'ORM à l'avenir, ma solution pourrait être meilleure pour vous.

class Model
{
    public Foo { get; set; }
    public Boo { get; set; }
    public Bar { get; set; }
    // More properties...

    public void SafeUpdate(Model updateModel, bool updateBoo = false)
    {
        // Notice Foo is excluded

        // An optional update
        if (updateBoo)
            Boo = updateModel.Boo;

        // A property that is always allowed to be updated
        Bar = updateModel.Bar;

        // More property mappings...
    }
}

Comme vous pouvez le constater, je n'autorise les mises à jour que pour les propriétés que je souhaite.

Un inconvénient de mon approche est que vous devrez mettre à jour manuellement cette méthode si vous introduisez de nouvelles propriétés (qui sont autorisées à être mises à jour) dans votre modèle. Mais je pense que ce n'est pas toujours un inconvénient mais parfois un avantage, dans le sens où vous devrez être conscient de ce qui est mis à jour, ce qui peut être bénéfique en termes de sécurité.

Voyons une démonstration de cette approche.

// Some code, DI etc...

public IActionResult Put([FromBody] Model updateModel)
{
   var safeModel = new Model();
   safeModel.Update(updateModel);

   // Add validation logic for safeModel here...

   _modelRepository.Update(safeModel);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X