Skip to content

Commit a2b4c9d

Browse files
Refactor: split unmapped FK helper into Register and Match methods
- RegisterUnmappedForeignKeyPredecessors: adds to predecessors map - MatchUnmappedForeignKeyEdges: calls AddMatchingPredecessorEdge
1 parent b8f948d commit a2b4c9d

1 file changed

Lines changed: 68 additions & 72 deletions

File tree

src/EFCore.Relational/Update/Internal/CommandBatchPreparer.cs

Lines changed: 68 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -672,10 +672,8 @@ private void AddForeignKeyEdges()
672672
predecessorCommands.Add(command);
673673
}
674674

675-
AddUnmappedForeignKeyEdges(new(
676-
command, predecessorsMap,
677-
Principal: true, FromOriginalValues: false,
678-
CheckStoreGenerated: true, MatchEdges: false));
675+
RegisterUnmappedForeignKeyPredecessors(
676+
command, predecessorsMap, principal: true, fromOriginalValues: false);
679677
}
680678
else
681679
{
@@ -731,10 +729,8 @@ private void AddForeignKeyEdges()
731729
}
732730
}
733731

734-
AddUnmappedForeignKeyEdges(new(
735-
command, originalPredecessorsMap,
736-
Principal: false, FromOriginalValues: true,
737-
CheckStoreGenerated: false, MatchEdges: false));
732+
RegisterUnmappedForeignKeyPredecessors(
733+
command, originalPredecessorsMap, principal: false, fromOriginalValues: true);
738734
}
739735
else
740736
{
@@ -791,10 +787,8 @@ private void AddForeignKeyEdges()
791787
predecessorsMap, dependentKeyValue, command, foreignKey, checkStoreGenerated: true);
792788
}
793789

794-
AddUnmappedForeignKeyEdges(new(
795-
command, predecessorsMap,
796-
Principal: false, FromOriginalValues: false,
797-
CheckStoreGenerated: true, MatchEdges: true));
790+
MatchUnmappedForeignKeyEdges(
791+
command, predecessorsMap, principal: false, fromOriginalValues: false, checkStoreGenerated: true);
798792
}
799793
else
800794
{
@@ -842,10 +836,8 @@ private void AddForeignKeyEdges()
842836
originalPredecessorsMap, principalKeyValue, command, foreignKey);
843837
}
844838

845-
AddUnmappedForeignKeyEdges(new(
846-
command, originalPredecessorsMap,
847-
Principal: true, FromOriginalValues: true,
848-
CheckStoreGenerated: false, MatchEdges: true));
839+
MatchUnmappedForeignKeyEdges(
840+
command, originalPredecessorsMap, principal: true, fromOriginalValues: true, checkStoreGenerated: false);
849841
}
850842
else
851843
{
@@ -982,88 +974,92 @@ private static bool CanCreateDependency(IKey key, IReadOnlyModificationCommand c
982974
return false;
983975
}
984976

985-
private readonly record struct UnmappedFkEdgeContext(
986-
IReadOnlyModificationCommand Command,
987-
Dictionary<object, List<IReadOnlyModificationCommand>> PredecessorsMap,
988-
bool Principal,
989-
bool FromOriginalValues,
990-
bool CheckStoreGenerated,
991-
bool MatchEdges);
992-
993-
private void AddUnmappedForeignKeyEdges(UnmappedFkEdgeContext context)
977+
private void RegisterUnmappedForeignKeyPredecessors(
978+
IReadOnlyModificationCommand command,
979+
Dictionary<object, List<IReadOnlyModificationCommand>> predecessorsMap,
980+
bool principal,
981+
bool fromOriginalValues)
994982
{
995-
foreach (var entry in context.Command.Entries)
983+
foreach (var entry in command.Entries)
996984
{
997-
var foreignKeys = context.Principal
985+
var foreignKeys = principal
998986
? entry.EntityType.GetReferencingForeignKeys()
999987
: (IEnumerable<IForeignKey>)entry.EntityType.GetForeignKeys();
1000988

1001989
foreach (var foreignKey in foreignKeys)
1002990
{
1003-
if (foreignKey.GetMappedConstraints().Any())
991+
if (foreignKey.GetMappedConstraints().Any()
992+
|| !CanCreateDependency(foreignKey, command, principal)
993+
|| !IsModified(principal ? foreignKey.PrincipalKey.Properties : foreignKey.Properties, entry))
1004994
{
1005995
continue;
1006996
}
1007997

1008-
if (!CanCreateDependency(foreignKey, context.Command, context.Principal))
998+
var keyValue = principal
999+
? foreignKey.GetDependentKeyValueFactory()
1000+
.CreatePrincipalEquatableKey(entry, fromOriginalValues)
1001+
: foreignKey.GetDependentKeyValueFactory()
1002+
?.CreateDependentEquatableKey(entry, fromOriginalValues);
1003+
1004+
if (principal)
10091005
{
1010-
continue;
1006+
Check.DebugAssert(keyValue != null, "null keyValue");
10111007
}
1012-
1013-
var keyProperties = context.Principal
1014-
? foreignKey.PrincipalKey.Properties
1015-
: foreignKey.Properties;
1016-
1017-
if (!IsModified(keyProperties, entry))
1008+
else if (keyValue is null)
10181009
{
10191010
continue;
10201011
}
10211012

1022-
if (context.CheckStoreGenerated
1023-
&& context.Principal
1024-
&& !IsStoreGenerated(entry, foreignKey.PrincipalKey))
1013+
if (!predecessorsMap.TryGetValue(keyValue!, out var predecessorCommands))
10251014
{
1026-
continue;
1015+
predecessorCommands = [];
1016+
predecessorsMap.Add(keyValue!, predecessorCommands);
10271017
}
10281018

1029-
if (context.MatchEdges)
1030-
{
1031-
var keyValue = context.Principal
1032-
? foreignKey.GetDependentKeyValueFactory()
1033-
.CreatePrincipalEquatableKey(entry, context.FromOriginalValues)
1034-
: foreignKey.GetDependentKeyValueFactory()
1035-
?.CreateDependentEquatableKey(entry, context.FromOriginalValues);
1019+
predecessorCommands.Add(command);
1020+
}
1021+
}
1022+
}
10361023

1037-
if (keyValue is null)
1038-
{
1039-
continue;
1040-
}
1024+
private void MatchUnmappedForeignKeyEdges(
1025+
IReadOnlyModificationCommand command,
1026+
Dictionary<object, List<IReadOnlyModificationCommand>> predecessorsMap,
1027+
bool principal,
1028+
bool fromOriginalValues,
1029+
bool checkStoreGenerated)
1030+
{
1031+
foreach (var entry in command.Entries)
1032+
{
1033+
var foreignKeys = principal
1034+
? entry.EntityType.GetReferencingForeignKeys()
1035+
: (IEnumerable<IForeignKey>)entry.EntityType.GetForeignKeys();
10411036

1042-
AddMatchingPredecessorEdge(
1043-
context.PredecessorsMap, keyValue, context.Command, foreignKey,
1044-
context.CheckStoreGenerated);
1045-
}
1046-
else
1037+
foreach (var foreignKey in foreignKeys)
1038+
{
1039+
if (foreignKey.GetMappedConstraints().Any()
1040+
|| !CanCreateDependency(foreignKey, command, principal)
1041+
|| !IsModified(principal ? foreignKey.PrincipalKey.Properties : foreignKey.Properties, entry))
10471042
{
1048-
var keyValue = context.Principal
1049-
? foreignKey.GetDependentKeyValueFactory()
1050-
.CreatePrincipalEquatableKey(entry, context.FromOriginalValues)
1051-
: foreignKey.GetDependentKeyValueFactory()
1052-
?.CreateDependentEquatableKey(entry, context.FromOriginalValues);
1043+
continue;
1044+
}
10531045

1054-
if (keyValue is null)
1055-
{
1056-
continue;
1057-
}
1046+
var keyValue = principal
1047+
? foreignKey.GetDependentKeyValueFactory()
1048+
.CreatePrincipalEquatableKey(entry, fromOriginalValues)
1049+
: foreignKey.GetDependentKeyValueFactory()
1050+
?.CreateDependentEquatableKey(entry, fromOriginalValues);
10581051

1059-
if (!context.PredecessorsMap.TryGetValue(keyValue, out var predecessorCommands))
1060-
{
1061-
predecessorCommands = [];
1062-
context.PredecessorsMap.Add(keyValue, predecessorCommands);
1063-
}
1064-
1065-
predecessorCommands.Add(context.Command);
1052+
if (principal)
1053+
{
1054+
Check.DebugAssert(keyValue != null, "null keyValue");
10661055
}
1056+
else if (keyValue is null)
1057+
{
1058+
continue;
1059+
}
1060+
1061+
AddMatchingPredecessorEdge(
1062+
predecessorsMap, keyValue!, command, foreignKey, checkStoreGenerated);
10671063
}
10681064
}
10691065
}

0 commit comments

Comments
 (0)