Поделиться через


Распространение изменений на внешнюю систему

Дата последнего изменения: 2 ноября 2009 г.

Применимо к: SharePoint Server 2010

В этой статье
Операция создания
Операция обновления
Операция удаления

При локальном изменении внешних данных операции записи не сразу маршрутизируются во внешнюю систему, а передаются в кэш. Кэш помещает эти операции в очередь и выполняет их по одной. Время выполнения операции в очереди невозможно предсказать, оно зависит от интервала обновления кэша, доступности внешнего приложения и некоторых других факторов. В следующем разделе описывается порядок выполнения различных операций записи кэшем.

Операция создания

При создании в приложении экземпляра сущности в режиме кэширования операция создания добавляется в очередь операций. Business Connectivity Services создает экземпляр сущности локально и назначает временный идентификатор созданному экземпляру сущности в кэше до появления возможности создания экземпляра сущности во внешнем приложении и получения его фактического идентификатора. Временный идентификатор (GUID) возвращается вызывающему приложению как часть ссылки EntityInstance.

ПримечаниеПримечание

Можно использовать флаг IsTemporary в поле Identity автономного экземпляра сущности для определения временной идентификации.

После успешного выполнения операции во внешнем приложении идентификатор вновь созданного экземпляра сущности обновляется до фактического идентификатора из внешней системы и экземпляр сущности помечается для обновления, что позволяет обновить значения всех вычисляемых полей. В случае сбоя вызова экземпляр сущности получает пометку InError, а все исключения записываются в кэш.

Операция обновления

При обновлении экземпляра сущности в приложении в режиме кэширования изменения записываются в кэш. Операция обновления добавляется в очередь, а исходные данные экземпляра сущности до локального обновления записываются в кэш. При выполнении этой операции среда выполнения сначала вызывает SpecificFinder для получения последних данных из внешнего приложения и сравнивает их с исходным состоянием, чтобы убедиться, что данные не были изменены во внешнем приложении другим пользователем или приложением. Если конфликты не обнаружены, выполняется вызов экземпляра метода Update во внешнем приложении. В случае успеха операции экземпляр сущности помечается как обновленный, что позволяет обновить все вычисляемые поля. В случае сбоя вызова экземпляр сущности получает пометку InError, а все исключения записываются в кэш. В случае обнаружения конфликта экземпляр сущности вновь получает пометку InError, а в кэш для нее записывается ConflictDetectedException.

С другой стороны, если SpecificFinder создает исключение ObjectNotFoundException или ObjectDeletedException, это означает, что данный экземпляр сущности уже удален во внешнем приложении другим пользователем или другим приложением, и в этом случае операция обновления помечается как неудачная.

Операция удаления

При удалении экземпляра сущности в приложении в режиме кэширования удаление записывается в кэш. Операция удаления добавляется в очередь, а исходные данные экземпляра сущности до локального удаления записываются в кэш. При выполнении этой операции среда выполнения сначала вызывает SpecificFinder для получения последних данных из внешнего приложения и сравнивает их с исходным состоянием, чтобы убедиться, что данные не были изменены во внешнем приложении другим пользователем или приложением. Если конфликты не обнаружены, выполняется вызов экземпляра метода Delete во внешнем приложении. В случае успеха операции экземпляр сущности в кэше получает пометку Deleted. В случае сбоя вызова экземпляр сущности получает пометку InError, а все исключения записываются в кэш.

С другой стороны, если SpecificFinder создает исключение ObjectNotFoundException или ObjectDeletedException, это означает, что данный экземпляр сущности во внешнем приложение уже удален другим пользователем или другим приложением, и в этом случае ошибки не возвращаются, экземпляр сущности удаляется из кэша, в операция удаления просто помечается как успешная.