Browse Source

Detecting if a navigation has been removed.

pull/19079/head
maliming 3 years ago
parent
commit
7875413398
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 38
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
  2. 6
      framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs

38
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs

@ -1,4 +1,5 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
@ -338,7 +339,7 @@ public abstract class AbpDbContext<TDbContext> : DbContext, IAbpEfCoreDbContext,
break;
}
foreach (var entityEntry in new[] { entry }.Where(HasEntityEntryChanged).Concat(ChangeTracker.Entries().Where(HasEntityEntryChanged)).DistinctBy(x => x.Entity))
foreach (var entityEntry in ChangeTracker.Entries().Where(HasEntityEntryChanged))
{
ApplyAbpConceptsForModifiedEntity(entry);
@ -355,6 +356,41 @@ public abstract class AbpDbContext<TDbContext> : DbContext, IAbpEfCoreDbContext,
protected virtual bool HasEntityEntryChanged(EntityEntry entry)
{
if (EntityChangeOptions.Value.PublishEntityUpdatedEventWhenNavigationChanges && entry.State == EntityState.Unchanged)
{
var entryId = entry.Entity is IEntity entryEntity && entryEntity.GetKeys().Length == 1 ? entryEntity.GetKeys().FirstOrDefault()?.ToString() : null;
if (entryId != null)
{
var entity = NavigationPropertyValues.GetOrAdd(entryId, () => new Dictionary<int, object?>());
var index = 0;
foreach (var navigationEntry in entry.Navigations.Where(navigation => !navigation.IsModified && navigation.IsLoaded))
{
var navigationEntryValue = entity.GetOrAdd(index, () => navigationEntry.CurrentValue);
if (navigationEntryValue != null &&
navigationEntryValue is not ICollection &&
navigationEntryValue != navigationEntry.CurrentValue)
{
return true;
}
if (navigationEntryValue is ICollection navigationEntryValueCollection &&
navigationEntry.CurrentValue is ICollection navigationEntryCurrentValueCollection &&
navigationEntryValueCollection.Count != 0 &&
navigationEntryCurrentValueCollection.Count == 0)
{
return true;
}
entity[index] = navigationEntry.CurrentValue is ICollection
? navigationEntry.CurrentValue.As<ICollection>().Cast<object?>().ToList()
: navigationEntry.CurrentValue;
index++;
}
}
}
if (entry.State != EntityState.Modified && entry.State != EntityState.Unchanged)
{
return false;

6
framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs

@ -239,8 +239,7 @@ public abstract class DomainEvents_Tests<TStartupModule> : TestAppTestBase<TStar
entity.OneToOne = null;
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
// https://github.com/dotnet/efcore/issues/24076#issuecomment-1996623874
// entityUpdatedEventTriggered.ShouldBeTrue();
entityUpdatedEventTriggered.ShouldBeTrue();
// Test with one to many
entityUpdatedEventTriggered = false;
@ -266,8 +265,7 @@ public abstract class DomainEvents_Tests<TStartupModule> : TestAppTestBase<TStar
entity.OneToMany.Clear();
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
// https://github.com/dotnet/efcore/issues/24076#issuecomment-1996623874
// entityUpdatedEventTriggered.ShouldBeTrue();
entityUpdatedEventTriggered.ShouldBeTrue();
// Test with many to many
entityUpdatedEventTriggered = false;

Loading…
Cancel
Save