Skip to content

Commit

Permalink
Don't leave unknown FK values when principal is known but has not-set…
Browse files Browse the repository at this point in the history
…, non-generated, value (#23875)

Fixes #23730
  • Loading branch information
ajcvickers committed Jan 15, 2021
1 parent 3c8a0f3 commit 918f7b5
Show file tree
Hide file tree
Showing 2 changed files with 677 additions and 109 deletions.
27 changes: 13 additions & 14 deletions src/EFCore/ChangeTracking/Internal/KeyPropagator.cs
Expand Up @@ -53,13 +53,14 @@ public virtual InternalEntityEntry PropagateValue(InternalEntityEntry entry, IPr
{
Check.DebugAssert(property.IsForeignKey(), $"property {property} is not part of an FK");

var principalEntry = TryPropagateValue(entry, property);
var generationProperty = property.FindGenerationProperty();
var principalEntry = TryPropagateValue(entry, property, generationProperty);

if (principalEntry == null
&& property.IsKey()
&& !property.IsForeignKeyToSelf())
{
var valueGenerator = TryGetValueGenerator(property);

var valueGenerator = TryGetValueGenerator(generationProperty);
if (valueGenerator != null)
{
var value = valueGenerator.Next(new EntityEntry(entry));
Expand Down Expand Up @@ -93,12 +94,13 @@ public virtual InternalEntityEntry PropagateValue(InternalEntityEntry entry, IPr
{
Check.DebugAssert(property.IsForeignKey(), $"property {property} is not part of an FK");

var principalEntry = TryPropagateValue(entry, property);
var generationProperty = property.FindGenerationProperty();
var principalEntry = TryPropagateValue(entry, property, generationProperty);

if (principalEntry == null
&& property.IsKey())
{
var valueGenerator = TryGetValueGenerator(property);

var valueGenerator = TryGetValueGenerator(generationProperty);
if (valueGenerator != null)
{
var value = await valueGenerator.NextAsync(new EntityEntry(entry), cancellationToken)
Expand All @@ -120,7 +122,7 @@ public virtual InternalEntityEntry PropagateValue(InternalEntityEntry entry, IPr
return principalEntry;
}

private static InternalEntityEntry TryPropagateValue(InternalEntityEntry entry, IProperty property)
private static InternalEntityEntry TryPropagateValue(InternalEntityEntry entry, IProperty property, IProperty generationProperty)
{
var entityType = entry.EntityType;
var stateManager = entry.StateManager;
Expand Down Expand Up @@ -158,7 +160,8 @@ private static InternalEntityEntry TryPropagateValue(InternalEntityEntry entry,
if (principalProperty != property)
{
var principalValue = principalEntry[principalProperty];
if (!principalProperty.ClrType.IsDefaultValue(principalValue))
if (generationProperty == null
|| !principalProperty.ClrType.IsDefaultValue(principalValue))
{
if (principalEntry.HasTemporaryValue(principalProperty))
{
Expand All @@ -182,13 +185,9 @@ private static InternalEntityEntry TryPropagateValue(InternalEntityEntry entry,
return null;
}

private ValueGenerator TryGetValueGenerator(IProperty property)
{
var generationProperty = property.FindGenerationProperty();

return generationProperty != null
private ValueGenerator TryGetValueGenerator(IProperty generationProperty)
=> generationProperty != null
? _valueGeneratorSelector.Select(generationProperty, generationProperty.DeclaringEntityType)
: null;
}
}
}

0 comments on commit 918f7b5

Please sign in to comment.