2009-05-12 17 views
0

J'essaie d'implémenter le verrouillage optimiste dans une application MVC asp.net, ainsi que de fournir un suivi d'audit.linq datacontext GetModifiedMembers dans le scénario Attacher

Le cadre d'audit repose sur la possibilité d'appeler DataContext.GetModifiedMembers lors de SubmitChanges, ce qui est logique, je suppose.

Le verrouillage optimiste utilise des horodatages ROWVERSION, sérialisés en base64 et placés dans un champ masqué dans la vue.

Mon action Edit ressemble à ceci:

[AcceptVerb(HttpVerb.Post)] 
public ActionResult Edit(MyType myType) 
{ 
    context.MyTypes.Attach(myType, true); 
    context.SubmitChanges(ConflictMode.FailOnFirstConflict); 
} 

En faisant cela, les DataContext.GetModifiedMembers retourneront toujours toutes les propriétés sur MyType, plutôt que seulement ceux qui sont modifiés entre la base de données et les valeurs fournies , ce qui casse l'audit. Spécifiquement, chaque propriété est renvoyée de sa nouvelle valeur à sa nouvelle valeur, ce qui fait que je ne peux rien faire d'intelligent à la liste.

J'ai essayé de charger l'objet en premier, avant de l'attacher, mais cela donne une exception de clé en double.

Je puis essayé d'utiliser UpdateModel, à savoir

[AcceptVerb(HttpVerb.Post)] 
public ActionResult Edit(int id, FormCollection col) 
{ 
    var mt = context.MyTypes.Single(mt => mt.id = id); 
    UpdateModel(mt); 
    context.SubmitChanges(ConflictMode.FailOnFirstConflict); 
} 

Cela fonctionne avec l'audit, mais ne le verrouillage optimiste. Plutôt qu'une ChangeConflictException, j'obtiens une exception InvalidOperationException parce que le UpdateModel modifie le champ concurrentTS (qui est apparemment en lecture seule).

Qu'est-ce que je fais mal?

Répondre

0

La progression jusqu'à présent consiste à effectuer la dernière partie et à rechercher InvalidOperationException et à rechercher le texte "Valeur du membre 'ConcurrencyTimestamp'", puis à le réécrire en tant que ChangeConflictException.

Cela semble faire l'affaire, mais ce n'est pas joli.

Questions connexes