[release/8.0] Fix to #33004 - Unfulfillable nullable contraints are set for complextypes with TPH entities #33054
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.
Port of #33052
Fixes #33004
Description
When figuring out nullability of columns representing a given property, if property is declared on derived entity in TPH, we make that column nullable. For complex type properties we should be doing the same (and we did), but declaring type of that property is the complex type itself. Instead we should look at the ContainingEntityType rather than just DeclaringType.
Customer impact
For scenario where customer defines a complex type on a derived entity in TPH hierarchy and that complex type has a required property we generate incorrect model. The result it is impossible to create an entity in that hierarchy that doesn't contain the complex type (this should be allowed for base types, if the complex type is defined on derived). Workaround is to manually modify the migration and set all the necessary columns to nullable.
How found
Customer reported on 8.
Regression
No, complex type support is a new feature in EF8.
Testing
Test added.
Risk
Very Low. Fix is a one line and a very straightforward change. We add call to the API that properly takes complex types into account when figuring out declaring entity type. We use that API in numerous places already and it's a no-op for non-complex type cases. Added quirk just to be safe.