Ho una situazione simile, in quanto il mio modello di dominio è costituito da una rete di entità collegate. L'ho risolto in questo modo:
Per ciascun tipo di entità, ho un EntityRepository corrispondente. Le Entità sono completamente inconsapevoli dell'esistenza dei repository.
Ogni tipo di EntityRepository mantiene una cache delle istanze Entity di cui è a conoscenza (quelli che sono stati recuperati da quel repository) e ha riferimenti ai repository delle entità collegate.
Quando salva un'entità nel suo repository, il repository verifica se conosce l'entità e la inserisce nel database (e nella sua cache) o aggiorna il database. Per le entità collegate, il repository richiede al repository dell'elemento collegato di salvare quell'elemento e quindi aggiorna i collegamenti del database tra le entità.
Le entità che sono dissociate l'una dall'altra vengono rilevate automaticamente in modo simile nei repository.
Per dare un esempio in pseudocodice:
// Entities
class Child { }
class Parent
{
addChild(Child);
Child[] getChildren();
}
// Repositories
class ChildRepository
{
save(Child entity)
{
if (cache.contains(entity))
updateDatabase(entity);
else
AddToDatabase(entity);
}
Child[] cache
}
class ParentRepository
{
save(Parent entity)
{
if (cache.contains(entity))
updateDatabase(entity);
else
AddToDatabase(entity);
childRepo.save(entity.children());
updateParentChildLinkTable();
}
Parent[] cache
ChildRepository childRepo
}