diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs index 1338e68400..39835569cb 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs @@ -75,9 +75,12 @@ public class AbpEfCoreNavigationHelper : ITransientDependency continue; } - if (checkEntityEntryState && entityEntry.State == EntityState.Unchanged) + 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 && checkEntityEntryState && entityEntry.State == EntityState.Unchanged) { - abpEntityEntry.UpdateNavigationEntries(entityEntry, foreignKey); + abpEntityEntry.UpdateNavigation(entityEntry, navigationEntry); } if (!abpEntityEntry.IsModified && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry))) @@ -86,8 +89,6 @@ public class AbpEfCoreNavigationHelper : ITransientDependency 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 && IsEntityEntryChanged(entityEntry)) { navigationEntry.IsModified = true; @@ -119,9 +120,12 @@ public class AbpEfCoreNavigationHelper : ITransientDependency continue; } - if (checkEntityEntryState && entityEntry.State == EntityState.Unchanged) + 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 && checkEntityEntryState && entityEntry.State == EntityState.Unchanged) { - abpEntityEntry.UpdateNavigationEntries(entityEntry, inverseForeignKey); + abpEntityEntry.UpdateNavigation(entityEntry, navigationEntry); } if (!abpEntityEntry.IsModified && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry))) @@ -130,8 +134,6 @@ public class AbpEfCoreNavigationHelper : ITransientDependency 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 && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry))) { navigationEntry.IsModified = true; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEntityEntry.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEntityEntry.cs index a759ef4ea7..6083e7d790 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEntityEntry.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEntityEntry.cs @@ -1,10 +1,8 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; -using Microsoft.EntityFrameworkCore.Metadata; namespace Volo.Abp.EntityFrameworkCore.ChangeTrackers; @@ -33,39 +31,30 @@ public class AbpEntityEntry NavigationEntries = EntityEntry.Navigations.Select(x => new AbpNavigationEntry(x, x.Metadata.Name)).ToList(); } - public void UpdateNavigationEntries(EntityEntry entityEntry, IForeignKey foreignKey) + public void UpdateNavigation(EntityEntry entityEntry, AbpNavigationEntry navigationEntry) { - var entityEntryNavigationEntry = NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is INavigation navigationMetadata && navigationMetadata.ForeignKey == foreignKey) ?? - NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is ISkipNavigation skipNavigationMetadata && skipNavigationMetadata.ForeignKey == foreignKey); - foreach (var navigationEntry in NavigationEntries) + if (IsModified || + EntityEntry.State == EntityState.Modified || + navigationEntry.IsModified) { - if (IsModified || - EntityEntry.State == EntityState.Modified || - navigationEntry.IsModified) - { - continue; - } + return; + } - var currentValue = navigationEntry.NavigationEntry.CurrentValue; - if (currentValue == null) - { - continue; - } + var currentValue = navigationEntry.NavigationEntry.CurrentValue; + if (currentValue == null) + { + return; + } - if (navigationEntry.NavigationEntry is CollectionEntry) - { - if (navigationEntry != entityEntryNavigationEntry) - { - continue; - } - navigationEntry.OriginalValue ??= new List(); - var ls = navigationEntry.OriginalValue.As>(); - ls.AddIfNotContains(entityEntry.Entity); - } - else - { - navigationEntry.OriginalValue = currentValue; - } + if (navigationEntry.NavigationEntry is CollectionEntry) + { + navigationEntry.OriginalValue ??= new List(); + var ls = navigationEntry.OriginalValue.As>(); + ls.AddIfNotContains(entityEntry.Entity); + } + else + { + navigationEntry.OriginalValue = currentValue; } } }