From d0130a75376b0134c6c1d63a2ff8ee39cd49eb6d Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 11 Feb 2026 14:49:57 +0800 Subject: [PATCH] Reset navigation IsModified flags and clear on UoW Resolve #24806 --- .../Volo/Abp/EntityFrameworkCore/AbpDbContext.cs | 14 +++++++++++++- .../ChangeTrackers/AbpEfCoreNavigationHelper.cs | 14 ++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index 6a5b608c76..2575126fd5 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -277,7 +277,19 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, finally { ChangeTracker.AutoDetectChangesEnabled = true; - AbpEfCoreNavigationHelper.RemoveChangedEntityEntries(); + AbpEfCoreNavigationHelper.ResetChangedFlags(); + if (UnitOfWorkManager.Current != null) + { + UnitOfWorkManager.Current.OnCompleted(() => + { + AbpEfCoreNavigationHelper.Clear(); + return Task.CompletedTask; + }); + } + else + { + AbpEfCoreNavigationHelper.Clear(); + } } } 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 39835569cb..077ff21d2b 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 @@ -222,9 +222,19 @@ public class AbpEfCoreNavigationHelper : ITransientDependency return null; } - public virtual void RemoveChangedEntityEntries() + public virtual void ResetChangedFlags() { - EntityEntries.RemoveAll(x => x.Value.IsModified); + foreach (var entry in EntityEntries.Values) + { + if (entry.IsModified) + { + entry.IsModified = false; + foreach (var navigation in entry.NavigationEntries) + { + navigation.IsModified = false; + } + } + } } public virtual void Clear()