Исходя из этого, мы должны продвинуть Расписание в совокупный корень
Если Schedule
имеет собственный жизненный цикл, то в любом случае он должен быть агрегатом, и это немного изменит ваш дизайн.
Однако, если предположить, что ваши отношения между Resource
-> Schedule
такие же, как Order
-> OrderItem
, тогда вы всегда можете сделать так, чтобы хранилище предоставило более простое удаление для Schedule
:
public interface IResourceRepository
{
void Add(Resource resource);
void RemoveSchedule(Resource resource, Resource.Schedule schedule); // or some such
}
Для Order
это, вероятно, не работа, учитывая, что будет , вероятно, будут соответствующими инвариантами.
обновление
Если ваш Schedule
является агрегированным корнем, то вы, вероятно, создадите его независимо от Resource
и ранее. Уникальность Schedule
будет находиться в пределах компетенции проверки набора , как упомянуто @VoiceOfUnreason. Тогда вашему Resource
все равно потребуется список ссылок на экземпляры Schedule
, но эти ссылки будут либо только Id
, либо некоторый объект значения будет содержать Id
и любые другие соответствующие биты. Гарантия того, что у вас нет повторяющихся расписаний, будет инвариантом, принудительно установленным Resource
.
Чтобы удалить расписание из ресурса, вы вернетесь к первым вариантам: либо загрузите Resource
и удалите соответствующее расписание Id
, либо просто удалите его "напрямую через репозиторий.
Всегда существует проблема удаления жесткого диска и мягкого, и обычно нужно только изменить статус (мягкое удаление), так как проблем меньше. В таком случае принудительное удаление Schedule
, вероятно, будет либо остановлено DRI в хранилище данных (если настроено), либо будет каскадно удалено в соответствующие таблицы.