Устранение ошибок параллелизма на клиенте Silverlight с помощью служб WCF RIA - PullRequest
1 голос
/ 02 июня 2010

У меня есть проект Silverlight 4, использующий WCF RIA Services RTM. Большая часть функциональности RIA работает, но у меня проблема с проверкой параллелизма. Сервер правильно проверяет параллелизм и передает исключение DomainOperationException в событие DomainDataSource.SubmittedChanges. Я занимаюсь этим даже и перечисляю EntitiesInError. Затем я вызываю Resolve для EntityConflict. Похоже, что это обновляет «старые значения» для сущностей, поэтому я могу повторно отправить их, но изменения клиента сохраняются в сущности. Я бы предпочел стереть изменения клиента и заставить их заново сделать их, или, возможно, в конечном итоге показать им, что изменилось, и позволить им выбрать, что оставить. Ниже приведен пример кода того, что у меня есть. Я нашел этот пост: http://sklementiev.blogspot.com/2010/03/wcf-ria-and-concurrency.html, но, похоже, он не работает с RIA Services RTM. Спасибо.

Пример кода:

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

1 Ответ

1 голос
/ 24 марта 2011

Я настоятельно рекомендую вам взглянуть на тренинг Ясин Хаммал по Pluralsight по борьбе с конфликтами параллелизма, который имеет фантастическую демонстрацию разрешения здесь (paywall, но 29 долларов в месяц и стоит во много раз больше). Смотрите видео под названием «Демонстрация: обработка ошибок валидации и параллелизма». Я не смог найти никакой документации о том, что это реализовано в примерах за пределами того, что представлено. Идеальным решением является то, что он работает над уровнем EF с помощью наборов изменений и позволяет определить, что изменилось с детализацией. Вы можете предложить пользователю сообщить ему, что то, что было загружено и отредактировано, отличается от того, что находится на сервере, и позволить им решить, хотят ли они перезаписать или вернуться к последней версии.

...