From 0dbe678a6309510cc15d40b5e7e8653e244f6746 Mon Sep 17 00:00:00 2001 From: Arthur Vickers Date: Wed, 2 Feb 2022 11:38:14 +0000 Subject: [PATCH] [release/6.0] Revert change to delete dependent when optional FK with cascade delete is set to null (#27216) --- src/EFCore/ChangeTracking/Internal/NavigationFixer.cs | 5 +++++ test/EFCore.Tests/ChangeTracking/ChangeTrackerTest.cs | 11 ++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs b/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs index 076d7c2d2c8..60ee13d870c 100644 --- a/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs +++ b/src/EFCore/ChangeTracking/Internal/NavigationFixer.cs @@ -38,6 +38,9 @@ public class NavigationFixer : INavigationFixer private readonly bool _useOldBehavior26779 = AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue26779", out var enabled) && enabled; + private readonly bool _useOldBehavior27174 + = AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue27174", out var enabled) && enabled; + /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in @@ -504,6 +507,8 @@ var targetDependentEntry } if (newValue == null + && (foreignKey.IsRequired + || _useOldBehavior27174) && (foreignKey.DeleteBehavior == DeleteBehavior.Cascade || foreignKey.DeleteBehavior == DeleteBehavior.ClientCascade)) { diff --git a/test/EFCore.Tests/ChangeTracking/ChangeTrackerTest.cs b/test/EFCore.Tests/ChangeTracking/ChangeTrackerTest.cs index 3582079735d..4862f22f233 100644 --- a/test/EFCore.Tests/ChangeTracking/ChangeTrackerTest.cs +++ b/test/EFCore.Tests/ChangeTracking/ChangeTrackerTest.cs @@ -1943,7 +1943,7 @@ public void Dependent_FKs_are_not_nulled_when_principal_is_detached(bool delayCa } } - [ConditionalTheory] // Issues #16546 #25360 + [ConditionalTheory] // Issues #16546 #25360; Change reverted in #27174. [InlineData(false, false, false, true, false)] [InlineData(true, false, false, true, false)] [InlineData(false, true, false, true, false)] @@ -2043,7 +2043,8 @@ public void Optional_relationship_with_cascade_still_cascades( Assert.Equal(EntityState.Unchanged, context.Entry(attachedContainer).State); Assert.Equal(EntityState.Unchanged, context.Entry(attachedTroduct).State); - if (delayCascade) + if (delayCascade + || (useForeignKey && setProperty)) { Assert.Equal(EntityState.Modified, context.Entry(attachedRoom).State); } @@ -2058,7 +2059,11 @@ public void Optional_relationship_with_cascade_still_cascades( Assert.Equal(3, context.ChangeTracker.Entries().Count()); Assert.Equal(EntityState.Unchanged, context.Entry(attachedContainer).State); Assert.Equal(EntityState.Unchanged, context.Entry(attachedTroduct).State); - Assert.Equal(EntityState.Deleted, context.Entry(attachedRoom).State); + + + Assert.Equal( + useForeignKey && setProperty ? EntityState.Modified : EntityState.Deleted, + context.Entry(attachedRoom).State); context.SaveChanges(); }