From 5f56d2bb0e3e2977d17d473aaaecec933e0c87e9 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 13 Apr 2024 16:17:33 +0800 Subject: [PATCH] Make `AbpEfCoreNavigationHelper` to support `Navigations` which `EnsureCollectionLoaded`. --- .../AbpEfCoreNavigationHelper.cs | 6 -- .../DomainEvents/DomainEvents_Tests.cs | 84 ++++++++++++++++++- 2 files changed, 83 insertions(+), 7 deletions(-) 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 74f0831be2..b7b044332b 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 @@ -50,12 +50,6 @@ public class AbpEfCoreNavigationHelper : ITransientDependency var index = 0; foreach (var navigationEntry in entityEntry.Navigations.Where(navigation => !navigation.IsModified)) { - if (!navigationEntry.IsLoaded) - { - index++; - continue; - } - var currentValue = navigationEntry.CurrentValue; if (navigationEntry.CurrentValue is ICollection collection) { 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 cb7a5522b1..978d411634 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 @@ -1,4 +1,16 @@ -using Volo.Abp.TestApp.Testing; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EntityFrameworkCore.DependencyInjection; +using Volo.Abp.EventBus.Local; +using Volo.Abp.TestApp.Domain; +using Volo.Abp.TestApp.Testing; +using Volo.Abp.Uow; +using Xunit; namespace Volo.Abp.EntityFrameworkCore.DomainEvents; @@ -9,3 +21,73 @@ public class DomainEvents_Tests : DomainEvents_Tests { } + +public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase +{ + protected readonly IRepository AppEntityWithNavigationsRepository; + protected readonly ILocalEventBus LocalEventBus; + + public AbpEfCoreDomainEvents_Tests() + { + AppEntityWithNavigationsRepository = GetRequiredService>(); + LocalEventBus = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + services.Configure(options => + { + options.Entity(opt => + { + opt.DefaultWithDetailsFunc = q => q; + }); + }); + + base.AfterAddApplication(services); + } + + [Fact] + public async Task Should_Trigger_Domain_Events_For_Aggregate_Root_When_EnsureCollectionLoaded_Navigation_Changes_Tests() + { + var entityId = Guid.NewGuid(); + + await AppEntityWithNavigationsRepository.InsertAsync(new AppEntityWithNavigations(entityId, "TestEntity") + { + OneToMany = new List() + { + new AppEntityWithNavigationChildOneToMany + { + ChildName = "ChildName1" + } + } + }); + + var entityUpdatedEventTriggered = false; + + LocalEventBus.Subscribe>(data => + { + entityUpdatedEventTriggered = !entityUpdatedEventTriggered; + return Task.CompletedTask; + }); + + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + using (var uow = uowManager.Begin()) + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToMany.ShouldBeNull(); + + await AppEntityWithNavigationsRepository.EnsureCollectionLoadedAsync(entity, x => x.OneToMany); + entity.OneToMany.ShouldNotBeNull(); + + entity.OneToMany.Clear(); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + + await uow.CompleteAsync(); + } + } + + entityUpdatedEventTriggered.ShouldBeTrue(); + } +}