Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Matthieu MEZIL

I love .Net

Abonnements

Actualités

Locations of visitors to this page English blog

La mise à jour en mode optimiste

Le pattern classique de détachement / attachement des entités est le suivant :

Le serveur récupère l'entité.
Le serveur l'envoit au client qui va la cloner.
Pour faire un update, le client va renvoyer au serveur l'entité initiale + l'entité modifiée.
Ensuite, le serveur instancie un nouveau contexte, attache l'entité initiale, appelle la méthode ApplyPropertyChanges avec l'entité modifié et enfin sauvegarde le contexte.

Cependant dans le cas où l'on ne se soucie pas des modifications éventuellement faites entre temps et qu'on considère que le dernier qui écrit a raison pour l'ensemble des propriétés, on peut se passer de l'entité initiale.
Avant de faire le ApplyPropertyChanges, il faut s'assurer que l'entité est bien dans le contexte. Pour cela, il suffit de la récupérer, ce que l'on va faire avec la méthode TryGetObjectByKey. Ensuite, l'appel de ApplyPropertyChanges et SaveChanges suffira à mettre à jour la base.

Cet exemple de code n'est pas un code client / serveur mais permet de valider la solution que je propose.

NorthwindModel.Categories c;

NorthwindModel.Categories c2;

using (var context = new NorthwindModel.NorthwindEntities())

{

    context.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking;

    c = context.Categories.First();

}

using (var context = new NorthwindModel.NorthwindEntities())

{

    c2 = context.Categories.First();

    context.DeleteObject(c2);

    context.SaveChanges();

}

using (var context = new NorthwindModel.NorthwindEntities())

{

    object o;

    context.TryGetObjectByKey(c.EntityKey, out o);

    context.ApplyPropertyChanges("Categories", c);

    context.SaveChanges();

}

Avec l'attachement puis le ApplyPropertyChanged suivi du SaveChanges ne fait rien si le row a été entre temps supprimé en base.

Avec le code précédent, on aura une exception sur le ApplyPropertyChanges car le TryGetObjectByKey ne chargera rien dans le contexte. Par contre avec le code suivant, non seulement on n'aura plus d'exception mais en plus, le SaveChanges recréera le row en base si celui-ci a été supprimé entre temps.

NorthwindModel.Categories c;

NorthwindModel.Categories c2;

using (var context = new NorthwindModel.NorthwindEntities())

{

    context.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking;

    c = context.Categories.First();

}

using (var context = new NorthwindModel.NorthwindEntities())

{

    c2 = context.Categories.First();

    context.DeleteObject(c2);

    context.SaveChanges();

}

using (var context = new NorthwindModel.NorthwindEntities())

{

    object o;

    context.TryGetObjectByKey(c.EntityKey, out o);

    if (o == null)

        context.AddToCategories(c);

    else

        context.ApplyPropertyChanges("Categories", c);

    context.SaveChanges();

}

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié vendredi 11 juillet 2008 21:54 par Matthieu MEZIL

Classé sous : ,

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [WPF] Nouvel article sur c2i.fr par Richard Clark le il y a 2 heures et 7 minutes

- F# nouvelle CTP 1.9.6.2 (update) par Pierrick's Blog le il y a 6 heures et 12 minutes

- La suite ...Proposition de collaboration rédactionnelle entre les communautés de développeurs et Microsoft France par LucasR le 09-05-2008, 17:45

- [Fun] Votre simulateur de vol avec Microsoft ESP par Julien Chable le 09-05-2008, 12:02

- [Best Practices] Customisation du My Site : Comment le modifier en amont et en aval par The Mit's Blog le 09-05-2008, 10:47

- Patrick Tisseghem s'en est allé ... par The Mit's Blog le 09-05-2008, 10:04

- MS AutoCollage par alex# le 09-05-2008, 09:18

- Un grand SharePointeur nous a quitte : Patrick Tisseghem manquera à la communauté ! par RedoBlog - The .NET Gentleman !!! le 09-05-2008, 08:52

- [WPF] Comment charger dynamiquement un fichier XAML qui définit des eventhandler ? par Thomas Lebrun le 09-04-2008, 10:56

- Article sur le filtrage des modèles de site SharePoint par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 09-04-2008, 00:11