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;
}
}