Skip to main content

Entity Framework et mises à jour de données avec ou sans contraintes

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;
    }
}
Jérémy Jeanson

Comments

You have to be logged in to comment this post.

Cookies Cookie Policy

This website uses cookies and similar technologies to allow us to promote our services and enhance your browsing experience. If you continue to use this website you agree to our use of cookies.