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 b46402e989..c4bd75cca2 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -282,7 +282,7 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, finally { ChangeTracker.AutoDetectChangesEnabled = true; - AbpEfCoreNavigationHelper.Clear(); + AbpEfCoreNavigationHelper.RemoveChangedEntityEntries(); } } 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 5a5cbe3a94..d56660be57 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 @@ -199,7 +199,12 @@ public class AbpEfCoreNavigationHelper : ITransientDependency return null; } - public void Clear() + public virtual void RemoveChangedEntityEntries() + { + EntityEntries.RemoveAll(x => x.Value.IsModified); + } + + public virtual void Clear() { EntityEntries.Clear(); } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs index 776e7d4766..f1b072c0ee 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs @@ -27,7 +27,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase protected readonly IRepository AppEntityWithNavigationsRepository; protected readonly ILocalEventBus LocalEventBus; protected readonly IRepository PersonRepository; - protected bool _loadEntityWithDetails = false; + protected bool _loadEntityWithoutDetails = false; public AbpEfCoreDomainEvents_Tests() { @@ -42,7 +42,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase { options.Entity(opt => { - if (_loadEntityWithDetails) + if (_loadEntityWithoutDetails) { opt.DefaultWithDetailsFunc = q => q; } @@ -55,7 +55,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase [Fact] public async Task Should_Trigger_Domain_Events_For_Aggregate_Root_When_Navigation_Changes_Tests() { - _loadEntityWithDetails = false; + _loadEntityWithoutDetails = false; var entityId = Guid.NewGuid(); @@ -77,6 +77,8 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await PersonRepository.InsertAsync(new Person(Guid.NewGuid(), Guid.NewGuid().ToString(), new Random().Next(1, 100))); }); + var unitOfWorkManager = ServiceProvider.GetRequiredService(); + // Test with simple property await WithUnitOfWorkAsync(async () => { @@ -92,6 +94,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.AppEntityWithValueObjectAddress = new AppEntityWithValueObjectAddress("Turkey"); await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -102,6 +105,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.AppEntityWithValueObjectAddress.Country = "USA"; await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -117,6 +121,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.AppEntityWithValueObjectAddress = null; await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -128,6 +133,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.OneToOne = new AppEntityWithNavigationChildOneToOne { ChildName = "ChildName", @@ -157,6 +163,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.OneToOne.ChildName = "ChildName2"; await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -171,6 +178,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.OneToOne.OneToOne.ChildName = "OneToOne-ChildName2"; await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -188,6 +196,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.OneToOne = null; await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -199,6 +208,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.OneToMany = new List() { new AppEntityWithNavigationChildOneToMany @@ -235,6 +245,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.OneToMany[0].ChildName = "ChildName2"; await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -249,6 +260,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.OneToMany[0].OneToMany[0].ChildName = "OneToMany-ChildName2"; await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -266,6 +278,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.OneToMany.Clear(); await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -277,6 +290,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.ManyToMany = new List() { new AppEntityWithNavigationChildManyToMany @@ -293,6 +307,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.ManyToMany[0].ChildName = "ChildName2"; await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -303,6 +318,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase await WithUnitOfWorkAsync(async () => { var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + await unitOfWorkManager.Current.SaveChangesAsync(); entity.ManyToMany.Clear(); await AppEntityWithNavigationsRepository.UpdateAsync(entity); }); @@ -313,7 +329,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase [Fact] public async Task Should_Trigger_Domain_Events_For_Aggregate_Root_When_EnsureCollectionLoaded_Navigation_Changes_Tests() { - _loadEntityWithDetails = true; + _loadEntityWithoutDetails = true; var entityId = Guid.NewGuid();