Ahora estoy usando técnicas de diseño de dominio impulsada. Esto me evita preocuparse por los desencadenadores de bases de datos, etc. y mantiene toda la lógica dentro del código .Net. La respuesta está aquí para que las personas puedan ver una alternativa.
Trato al principal de la colección de períodos como aggregate root y la raíz tiene una marca de tiempo. La raíz agregada es un límite de consistencia para transacciones, distribuciones y simultaneidad (ver Evans - what I've learned since the blue book). Esto se usa para verificar la última vez que se confirmó cualquier cambio en la base de datos.
Luego tengo métodos para agregar los períodos de alquiler al padre. Probé la superposición al agregar el movimiento a la raíz agregada. p.ej. AddHire(start,end)
- validará que esto no crea superposición en el objeto de dominio en memoria.
AS no hay superposición Guardo los cambios (a través de mi repositorio), y compruebo que la marca de tiempo de la base de datos sigue siendo la misma que al comienzo del proceso. Suponiendo que la marca de tiempo es la misma que cuando recuperé la entidad, los cambios se mantienen y la base de datos actualiza la marca de tiempo.
Si alguien más intenta guardar los cambios cuando se está trabajando en la raíz del agregado, entonces confirmaré primero o lo harán. Si confirmo primero, las marcas de tiempo no coincidirán y la verificación de superposición se volverá a ejecutar para asegurarse de que no hayan creado una superposición en el tiempo intermedio.
la única solución orientada a la base de datos que puedo pensar es la configuración de un disparador 'INSTEAD OF', un procedimiento que hace la comprobación. ¡pero lo evitaría y verificaría la superposición del código! – vulkanino
Desde el punto de vista del marco de entidad no creo que pueda verificar fácilmente en el código. Puedo verificar en un punto, pero existe la posibilidad de que dos personas agreguen/editen eventos al mismo tiempo – GraemeMiller
¡Pensé que el marco de entidades haría que el acceso a los datos sea más fácil, no más difícil! Es un cheque simple después de todo. La concurrencia es un problema, que puede resolver con bloqueo, si la arquitectura le permite (web/sin estado?) – vulkanino