Administrar la simultaneidad de datos
WCF RIA Services admite la simultaneidad optimista para garantizar la coherencia de los datos y se basa en la capacidad de los desarrolladores para proporcionar la lógica necesaria para controlar los conflictos que puedan producirse al actualizar un origen de datos. Cuando se permite que los usuarios actualicen o eliminen datos, debe asegurarse de que otro proceso no haya cambiado los datos del origen de datos antes de actualizar a ciegas sus valores en el registro de datos o eliminarlos del registro. Si no comprueba si los valores han cambiado, puede sobrescribir involuntariamente valores establecidos por otro proceso y generar datos incoherentes. La simultaneidad optimista supone que dichos conflictos son raros, pero compara el valor obtenido del origen de datos, y lo que se ha podido cambiar o eliminar, con el valor actual contenido en el origen. Si no coinciden, se produce una excepción OptimisticConcurrencyException que debe ser controlada.
Para obtener procedimientos sobre cómo especificar la comprobación de valores para saber si son coherentes, vea Habilitar comprobaciones de simultaneidad optimista. Para obtener información sobre cómo utilizar transacciones explícitas para garantizar la coherencia, vea Agregar transacciones explícitas a un servicio de dominio
Utilizar los atributos de simultaneidad
De forma predeterminada, RIA Services no pasa la entidad original completa, junto con los valores modificados, a la capa de acceso a datos para comprobar la simultaneidad de los datos. En su lugar, RIA Services almacena y devuelve solamente los miembros que están marcados con el atributo RoundtripOriginalAttribute, el atributo ConcurrencyCheckAttribute o el atributo TimestampAttribute.
Cada uno de estos atributos se pueden aplicar a propiedades de una clase de metadatos, o a la propia clase de metadatos, cuando se trabaja con Entity Framework. También se pueden aplicar directamente a propiedades o clases de tipos CLR cuando se trabaja con modelos de datos definidos con POCO. Para obtener más información, vea Agregar clases de metadatos. Cuando compile después de aplicar estos atributos, los atributos respectivos se mostrarán en el código generado del cliente para las propiedades o las clases. La aplicación de un atributo a una clase en lugar de a una propiedad de la clase, es equivalente a la aplicación del atributo a todos los miembros de la clase. Los atributos ConcurrencyCheckAttribute y TimestampAttribute también hacen que el atributo RoundtripOriginalAttribute se muestre en la clase o la propiedad del cliente a la que se han aplicado en los metadatos de servicio de dominio. Con esta implementación, puede optimizar el rendimiento de su aplicación mediante la especificación únicamente de aquellos miembros que quiere que participen en la comprobación de simultaneidad. Para obtener más información, vea
[!NOTA] Si se aplica el atributo KeyAttribute a la propiedad de un tipo de entidad, también se agrega el atributo RoundtripOriginalAttribute a la propiedad correspondiente generada en el cliente cuando se crea el proyecto. De ahí que en los servicios de dominio generados desde un origen de base de datos con el asistente Agregar nueva clase de servicio de dominio, este sea el comportamiento predeterminado para las propiedades que actúan como clave de entidad.
Cuando se aplica el atributo RoundtripOriginalAttribute, la capa de acceso a datos compara el valor original del origen de datos recodificado cuando se recuperaron los datos con el valor actual de los datos en el origen de datos. Si los valores coinciden, los datos del almacén no han cambiado y la capa de acceso a datos actualiza o elimina los datos. Si los datos han cambiado, se produce un conflicto y se produce una excepción OptimisticConcurrencyException. La información sobre el conflicto se almacena en la propiedad EntityConflict de la entidad que ya no tiene los datos actuales.
Si aplica el atributo ExcludeAttribute a un miembro de una entidad que se puede actualizar o eliminar en el cliente, no puede utilizarse ese miembro para las comprobaciones de simultaneidad optimista. Cuando se excluye el miembro, el valor original correcto no se almacena para ese miembro y siempre se producirá un error en la operación de actualización. Para obtener más información, vea Agregar clases de metadatos.
Controlar la excepción OptimisticConcurrencyException
Cuando los cambios de datos en la memoria caché de objetos entran en conflicto con los cambios realizados en el origen de datos después de agregarse o actualizarse objetos en la memoria caché, se revierte la transacción completa. Cuando se produce una excepción OptimisticConcurrencyException, se debe controlar especificando si el conflicto se debe resolver conservando los datos en los datos de objeto (ClientWins) o actualizando la memoria caché de objetos con los datos del origen de datos (StoreWins). Para obtener orientación sobre cómo realizar esta acción, vea Guardar los cambios y administrar la simultaneidad (Entity Framework).