@@ -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