Fix FK dependency ordering when replacing owned entities with foreign key references #36769
+108
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR addresses a critical issue where Entity Framework Core generates SQL commands in the wrong order when replacing an owned entity that has foreign key relationships to other entities, causing FK constraint violations.
Problem
When an owned entity (like
File
) references another entity (likeContent
) through a foreign key, and the owned entity is replaced duringSaveChanges()
, EF Core was generating commands in this incorrect order:This causes a foreign key constraint violation because the
UPDATE
command tries to referenceContent(Id=2)
before it's inserted, and theDELETE
command tries to removeContent(Id=1)
while it's still being referenced.Solution
The fix modifies the
CanCreateDependency
method inCommandBatchPreparer
to properly handle foreign key dependencies for owned entities. Previously, the dependency tracking logic was excluding owned entity FK relationships under the assumption they were "handled elsewhere," but this was incorrect for owned entities that reference non-owned entities.The corrected command order is:
Changes Made
CanCreateDependency
to identify owned entities that have FK relationships to non-owned entitiesBatchCommands_sorts_FK_dependencies_correctly_when_replacing_owned_entity
to verify the fixTest Case
The fix handles scenarios like:
Addressing #36059.
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.