Browse Source

Merge pull request #23199 from abpframework/auto-merge/rel-9-2/3829

Merge branch rel-9.3 with rel-9.2
pull/23200/head
maliming 1 year ago
committed by GitHub
parent
commit
3aeee867f2
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 45
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs

45
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs

@ -31,14 +31,6 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
protected virtual void EntityEntryTrackedOrStateChanged(EntityEntry entityEntry)
{
if (entityEntry.State is EntityState.Unchanged or EntityState.Modified)
{
foreach (var entry in EntityEntries.Values.Where(x => x.NavigationEntries.Any()))
{
entry.UpdateNavigationEntries();
}
}
if (entityEntry.State != EntityState.Unchanged)
{
return;
@ -58,23 +50,11 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
EntityEntries.Add(entryId, new AbpEntityEntry(entryId, entityEntry));
}
protected virtual void DetectChanges(EntityEntry entityEntry)
{
if (entityEntry.State != EntityState.Added &&
entityEntry.State != EntityState.Deleted &&
entityEntry.State != EntityState.Modified)
{
return;
}
RecursiveDetectChanges(entityEntry);
}
protected virtual void RecursiveDetectChanges(EntityEntry entityEntry)
protected virtual void DetectChanges(EntityEntry entityEntry, bool checkEntityEntryState = true)
{
#pragma warning disable EF1001
var stateManager = entityEntry.Context.GetDependencies().StateManager;
var internalEntityEntityEntry = stateManager.Entries.FirstOrDefault(x => x.Entity == entityEntry.Entity);
var internalEntityEntityEntry = stateManager.TryGetEntry(entityEntry.Entity, throwOnNonUniqueness: false);
if (internalEntityEntityEntry == null)
{
return;
@ -95,15 +75,16 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
continue;
}
if (!abpEntityEntry.IsModified)
abpEntityEntry.UpdateNavigationEntries();
if (!abpEntityEntry.IsModified && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
{
abpEntityEntry.IsModified = true;
RecursiveDetectChanges(abpEntityEntry.EntityEntry);
DetectChanges(abpEntityEntry.EntityEntry, false);
}
var navigationEntry = abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is INavigation navigationMetadata && navigationMetadata.ForeignKey == foreignKey) ??
abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is ISkipNavigation skipNavigationMetadata && skipNavigationMetadata.ForeignKey == foreignKey);
if (navigationEntry != null)
if (navigationEntry != null && IsEntityEntryChanged(entityEntry))
{
navigationEntry.IsModified = true;
}
@ -134,15 +115,16 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
continue;
}
if (!abpEntityEntry.IsModified)
abpEntityEntry.UpdateNavigationEntries();
if (!abpEntityEntry.IsModified && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
{
abpEntityEntry.IsModified = true;
RecursiveDetectChanges(abpEntityEntry.EntityEntry);
DetectChanges(abpEntityEntry.EntityEntry, false);
}
var navigationEntry = abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is INavigation navigationMetadata && navigationMetadata.ForeignKey == inverseForeignKey) ??
abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is ISkipNavigation skipNavigationMetadata && skipNavigationMetadata.ForeignKey == inverseForeignKey);
if (navigationEntry != null)
if (navigationEntry != null && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
{
navigationEntry.IsModified = true;
}
@ -151,6 +133,13 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
#pragma warning restore EF1001
}
protected virtual bool IsEntityEntryChanged(EntityEntry entityEntry)
{
return entityEntry.State == EntityState.Added ||
entityEntry.State == EntityState.Deleted ||
entityEntry.State == EntityState.Modified;
}
public virtual List<EntityEntry> GetChangedEntityEntries()
{
return EntityEntries

Loading…
Cancel
Save