Skip to content

Commit a57d2e5

Browse files
authored
Perf: Cache change detector in state manager CascadeDelete (#22261)
Resolves #22215
1 parent 70c72eb commit a57d2e5

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

src/EFCore/ChangeTracking/Internal/StateManager.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ private readonly EntityReferenceMap _entityReferenceMap
4444
private IIdentityMap _identityMap1;
4545
private Dictionary<IKey, IIdentityMap> _identityMaps;
4646
private bool _needsUnsubscribe;
47+
private IChangeDetector _changeDetector;
48+
private bool _changeDetectorInitialized;
4749

4850
private readonly IDiagnosticsLogger<DbLoggerCategory.ChangeTracking> _changeTrackingLogger;
4951
private readonly IInternalEntityEntryFactory _internalEntityEntryFactory;
@@ -81,6 +83,7 @@ public StateManager([NotNull] StateManagerDependencies dependencies)
8183

8284
UpdateLogger = dependencies.UpdateLogger;
8385
_changeTrackingLogger = dependencies.ChangeTrackingLogger;
86+
_changeDetectorInitialized = false;
8487
}
8588

8689
/// <summary>
@@ -987,10 +990,14 @@ public virtual void CascadeDelete(InternalEntityEntry entry, bool force, IEnumer
987990
{
988991
var doCascadeDelete = force || CascadeDeleteTiming != CascadeTiming.Never;
989992
var principalIsDetached = entry.EntityState == EntityState.Detached;
990-
var changeDetector = Context.ChangeTracker.AutoDetectChangesEnabled
991-
&& (string)Context.Model[CoreAnnotationNames.SkipDetectChangesAnnotation] != "true"
992-
? Context.GetDependencies().ChangeDetector
993-
: null;
993+
if (!_changeDetectorInitialized)
994+
{
995+
_changeDetector = Context.ChangeTracker.AutoDetectChangesEnabled
996+
&& (string)Context.Model[CoreAnnotationNames.SkipDetectChangesAnnotation] != "true"
997+
? Context.GetDependencies().ChangeDetector
998+
: null;
999+
_changeDetectorInitialized = true;
1000+
}
9941001

9951002
foreignKeys ??= entry.EntityType.GetReferencingForeignKeys();
9961003
foreach (var fk in foreignKeys)
@@ -1008,7 +1015,7 @@ public virtual void CascadeDelete(InternalEntityEntry entry, bool force, IEnumer
10081015
continue;
10091016
}
10101017

1011-
changeDetector?.DetectChanges(dependent);
1018+
_changeDetector?.DetectChanges(dependent);
10121019

10131020
if (dependent.EntityState != EntityState.Deleted
10141021
&& dependent.EntityState != EntityState.Detached

0 commit comments

Comments
 (0)