1

J'ai un projet Silverlight 4 utilisant WCF RIA Services RTM. La plupart des fonctionnalités RIA fonctionnent, mais j'ai un problème avec la vérification de la concurrence. Le serveur vérifie correctement la concurrence et transmet une exception DomainOperationException à l'événement DomainDataSource.SubmittedChanges. Je gère cela même et en énumérant les EntitiesInError. J'appelle ensuite un Resolve sur le EntityConflict. Cela semble mettre à jour les "anciennes valeurs" pour les entités afin que je puisse ensuite les soumettre à nouveau, mais les changements du client sont conservés dans l'entité. Je préférerais effacer les changements du client et les inciter à les refaire, ou éventuellement leur montrer ce qui a changé et les laisser choisir ce qu'ils veulent garder. Voici un exemple de code de ce que j'ai jusqu'ici. J'ai trouvé cet article: http://sklementiev.blogspot.com/2010/03/wcf-ria-and-concurrency.html mais il ne semble pas fonctionner avec les services RIA RTM. Merci.Résoudre les erreurs de simultanéité sur le client Silverlight avec les services WCIA RIA

Exemple de code:

Private Sub dds_SubmittedChanges(ByVal sender As Object, ByVal e As System.Windows.Controls.SubmittedChangesEventArgs) 
    If e.HasError Then 
     If TypeOf e.Error Is DomainOperationException Then 
      handleDomainOperationException(sender, e, "myType") 

     End If 
    End If 
End Sub 

Private Sub handleDomainOperationException(ByVal sender As Object, ByVal e As SubmittedChangesEventArgs, ByVal entityType As String) 
    Dim dds As DomainDataSource = DirectCast(sender, DomainDataSource) 
    Select Case DirectCast(e.Error, DomainOperationException).Status 
     Case OperationErrorStatus.Conflicts 
      ErrorWindow.CreateNew(String.Format("Another user updated this {0} between the time that you viewed it and when you submitted your changes. Your changes have been reverted. Please make your changes again and re-submit.", entityType)) 

      For Each ent In e.EntitiesInError 
       If Not ent.EntityConflict.IsDeleted Then 
        'tried this, doesn't overwrite changes, just updates old fields 
        ent.EntityConflict.Resolve() 

       Else 
        Throw New Exception("This entity has already been deleted.") 
       End If 
      Next 
      e.MarkErrorAsHandled() 
     Case OperationErrorStatus.ValidationFailed 
      ErrorWindow.CreateNew("Data validation failed") 
    End Select 
End Sub 

Répondre

1

Je recommande fortement vous regardez la formation Pluralsight de Yacine Khammal sur le traitement des conflits d'accès concurrentiel qui a une démonstration fantastique d'une résolution here (paywall, mais 29 $ par mois et d'une valeur à plusieurs reprises que). Voir la vidéo intitulée "Demo: gestion des erreurs de validation et de concurrence". Je n'ai pas pu trouver de documentation de ceci étant mis en œuvre dans des échantillons en dehors de ce qui est présenté. Ce qui rend cette solution idéale, c'est qu'elle fonctionne au-dessus de la couche EF à travers les changesets et vous permet d'identifier ce qui a changé avec la granularité. Vous pouvez demander à l'utilisateur de l'informer que ce qui a été chargé et modifié est différent de ce qui est sur le serveur et de le laisser décider s'il souhaite remplacer ou revenir au dernier.

Questions connexes