public override async Task <bool> Save(AggregateRootWithEvents aggregateRoot) { if (aggregateRoot is DHCPv4RootScope == false) { return(await base.Save(aggregateRoot)); } PseudoDHCPv4RootScope pseudoRootScope = new(); var events = aggregateRoot.GetChanges(); List <AggregateRootWithEvents> aggregatesToSave = new(); aggregatesToSave.Add(pseudoRootScope); HashSet <Guid> scopesToDelete = new(); HashSet <Guid> leasesToDelete = new(); foreach (var item in events) { switch (item) { case DHCPv4ScopeAddedEvent e: { pseudoRootScope.AddScope(e.Instructions.Id); var pseudoScope = new PseudoDHCPv4Scope(e.Instructions.Id); pseudoScope.AddChange(e); aggregatesToSave.Add(pseudoScope); } break; case DHCPv4ScopeDeletedEvent e: { pseudoRootScope.RemoveScope(e.EntityId); scopesToDelete.Add(e.EntityId); } break; case EntityBasedDomainEvent e when item is DHCPv4ScopePropertiesUpdatedEvent || item is DHCPv4ScopeNameUpdatedEvent || item is DHCPv4ScopeDescriptionUpdatedEvent || item is DHCPv4ScopeResolverUpdatedEvent || item is DHCPv4ScopeAddressPropertiesUpdatedEvent || item is DHCPv4ScopeParentUpdatedEvent || item is DHCPv4ScopeAddressesAreExhaustedEvent || item is DHCPv4ScopeSuspendedEvent || item is DHCPv4ScopeReactivedEvent: { var pseudoScope = new PseudoDHCPv4Scope(e.EntityId); pseudoScope.AddChange(e); aggregatesToSave.Add(pseudoScope); } break; case DHCPv4LeaseCreatedEvent e: { pseudoRootScope.AddLease(e.EntityId); var pseudoScope = new PseudoDHCPv4Lease(e.EntityId); pseudoScope.AddChange(e); aggregatesToSave.Add(pseudoScope); } break; case DHCPv4LeaseRemovedEvent e: { pseudoRootScope.RemoveLease(e.EntityId); leasesToDelete.Add(e.EntityId); } break; case DHCPv4ScopeRelatedEvent e: { var pseudoLease = new PseudoDHCPv4Lease(e.EntityId); pseudoLease.AddChange(e); aggregatesToSave.Add(pseudoLease); } break; default: break; } } foreach (var item in aggregatesToSave) { await EventStore.Save(item, 20); if (item is PseudoDHCPv4Lease) { var propertyResolver = Provider.GetService <IDHCPv6ServerPropertiesResolver>(); await EventStore.ApplyMetaValuesForStream <PseudoDHCPv4Lease>( item.Id, new EventStoreStreamMetaValues(EventStoreStreamMetaValues.DoNotTruncate, propertyResolver.GetLeaseLifeTime())); } } foreach (var item in scopesToDelete) { await EventStore.DeleteAggregateRoot <PseudoDHCPv4Scope>(item); } foreach (var item in leasesToDelete) { await EventStore.DeleteAggregateRoot <PseudoDHCPv4Lease>(item); } aggregateRoot.ClearChanges(); Boolean projectResult = await ReadStore.Project(events); return(projectResult); }