Avec MVC, Entity Framework a pris un essort incroyable. Les mauvaises pratiques aussi. Je profite de cet article pour tordre le coup à une idée qui a la peau dure : “pour mettre à jour des données avec EF, il faudrait systématiquement utiliser l’entité avec toutes ses propriétés”.

C’est est faux. Avec EF, on peut effectuer des mises à jour en choisissant les propriétés utiles.

Ceci peut se faire en quelques étapes clés :

1. Instancier un objet avec les valeurs voulues. Seul impératif: utiliser la clé primaire de l’enregistrement à mettre à jour. Le set sur les propriétés n’a pas besoin d’être fait lors de l’instanciation, ceci facilite juste l’écriture.

// Instanciation de l'entité à mettre à jour
Customer entity = new Customer
{
    Id = 10,// ma clé primaire
    Name = "Duc",
    FirtName = "Donald",
    Email = "faux.mail@outlook.com",
};

 

2. Attacher l’entité au contexte de donnée.

// Attacher l'entité au context
_datacontext.Customers.Attach(entity);

 

3. Expliciter les propriétés qui seront modifiées.

// Recupération de l'entry et marquages de propriété à mettre à jour
var entry = _datacontext.Entry(entity);
entry.Property(c => c.Name).IsModified = true;
entry.Property(c => c.FirtName).IsModified = true;
entry.Property(c => c.Email).IsModified = true;

 

4. (optionnel) Désactiver la validation Si on ne modifie pas certaine propriété qui ont des contraintes (ex: une propriété qui ne peut pas être null).

// Désactiver la validation 
// pour ne pas chercher à valider des donnée qui ne font pas partie de l'update
_datacontext.Configuration.ValidateOnSaveEnabled = false;

 

5. Lancer l’enregistrement.

// Enregister les modifications
Boolean result = _datacontext.SaveChanges() > 0;

 

Et pour ceux qui voudraient avoir une idée de ce que cela peut donner dans une méthode complette :

public Boolean UpdateCustomer(Int32 id, String name, String firstName, String email)
{
    // Instanciation de l'entité à mettre à jour
    Customer entity = new Customer
    {
        Id = id,
        Name = name,
        FirtName = firstName,
        Email = email,
    };

    // Attacher l'entité au context
    _datacontext.Customers.Attach(entity);

    // Recupération de l'entry et marquages de propriété à mettre à jour
    var entry = _datacontext.Entry(entity);
    entry.Property(c => c.Name).IsModified = true;
    entry.Property(c => c.FirtName).IsModified = true;
    entry.Property(c => c.Email).IsModified = true;

    // Enregistrement
    try
    {
        // Désactiver la validation 
        // pour ne pas chercher à valider des donnée qui ne font pas partie de l'update
        _datacontext.Configuration.ValidateOnSaveEnabled = false;
        // Enregister les modifications
        return _datacontext.SaveChanges() > 0;
    }
    finally
    {
        // Retour à la normale
        _datacontext.Configuration.ValidateOnSaveEnabled = true;
    }
}