Я сейчас использую методы проектирования, управляемые доменом.Это мешает мне беспокоиться о триггерах базы данных и т. Д. И сохраняет всю логику в .Net-коде.Ответ здесь, чтобы люди могли видеть альтернативу.
Я рассматриваю родителя коллекции периодов как совокупный корень , а корень имеет временную метку.Совокупный корень - это границы согласованности для транзакций, распределений и параллелизма (см. Эванс - то, что я узнал со времен синей книги ).Это используется для проверки того, когда в базе данных в последний раз было подтверждено любое изменение.
У меня есть способы добавить периоды найма в родительский объект.Я проверяю перекрытие при добавлении движения в совокупный корень.Например, AddHire(start,end)
- подтвердит, что это не создает перекрытия для объекта в домене памяти.
Поскольку нет перекрытия, я сохраняю изменения (через свой репозиторий) и проверяю, что временная метка базы данных остается такой же, какв начале процесса.Предполагая, что отметка времени такая же, как и при извлечении сущности, изменения сохраняются, и база данных обновляет отметку времени.
Если кто-то еще попытается сохранить изменения во время работы с агрегатным корнем, то я либо внесу изменениясначала или они будут.Если я фиксирую в первый раз, временные метки не будут совпадать, и проверка на перекрытие будет запущена повторно, чтобы убедиться, что они не создали наложения за прошедшее время.