Hi Jay -
Here's how I do a Recursive isDirty. The Simplest method is to check the entire EntityGraph (Parents, Siblings, as well as Children).
However, as you see below, I have implemented complex, true Recursive isDirty. Hope this helps!
Ryan
#Region "RecursiveIsDirty"
Public Enum RecursiveIsDirtyMode
RecursiveChildrenAndSiblings
RecursiveChildren
EntireGraph
End Enum
'This works great. It also tests for Entities scheduled to be deleted in the .RemovedEntitiesTracker.
Public Shared Function RecursiveIsDirty(ByVal argEntity As IEntity, Optional ByVal argRecursiveIsDirtyMode As RecursiveIsDirtyMode = RecursiveIsDirtyMode.RecursiveChildrenAndSiblings) As Boolean
'Entity Dirty?
If argEntity.IsDirty Then Return True
'Mode = Entire Graph
If argRecursiveIsDirtyMode = RecursiveIsDirtyMode.EntireGraph Then
Dim utils As New ObjectGraphUtils()
Dim myList As List(Of IEntity) = utils.ProduceTopologyOrderedList(argEntity)
For Each myEntity As IEntity In myList
If myEntity.IsDirty = True Then Return True
Next
End If
'Mode = RecursiveChildren/RecursiveChildrenSiblings
If argRecursiveIsDirtyMode = RecursiveIsDirtyMode.RecursiveChildren Or argRecursiveIsDirtyMode = RecursiveIsDirtyMode.RecursiveChildrenAndSiblings Then
For Each myChildCollection As IEntityCollection In GetChildEntities(argEntity, True, False, False).Values
If myChildCollection IsNot Nothing AndAlso RecursiveIsDirty(myChildCollection, argRecursiveIsDirtyMode) Then Return True
Next
End If
'Mode = RecursiveChildrenSiblings
If argRecursiveIsDirtyMode = RecursiveIsDirtyMode.RecursiveChildrenAndSiblings Then
For Each mySibling As IEntity In GetSiblingEntities(argEntity, True).Values
If mySibling IsNot Nothing AndAlso RecursiveIsDirty(mySibling, argRecursiveIsDirtyMode) Then Return True
Next
End If
Return False
End Function
Public Shared Function RecursiveIsDirty(ByVal argCollection As IEntityCollection, Optional ByVal argRecursiveIsDirtyMode As RecursiveIsDirtyMode = RecursiveIsDirtyMode.RecursiveChildrenAndSiblings) As Boolean
'Check for Entities in DeleteTracker
If argCollection.RemovedEntitiesTracker IsNot Nothing AndAlso argCollection.RemovedEntitiesTracker.Count > 0 Then
Return True
End If
'Loop through Collection
For Each myEntity As IEntity In argCollection
If myEntity IsNot Nothing AndAlso RecursiveIsDirty(myEntity, argRecursiveIsDirtyMode) Then Return True
Next
Return False
End Function
#End Region