Browse Source

Refactor navigation entry update logic in change tracker

pull/23329/head
maliming 10 months ago
parent
commit
2f452931ec
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 18
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs
  2. 51
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEntityEntry.cs

18
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs

@ -75,9 +75,12 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
continue; 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))) if (!abpEntityEntry.IsModified && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
@ -86,8 +89,6 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
DetectChanges(abpEntityEntry.EntityEntry, false); 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)) if (navigationEntry != null && IsEntityEntryChanged(entityEntry))
{ {
navigationEntry.IsModified = true; navigationEntry.IsModified = true;
@ -119,9 +120,12 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
continue; 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))) if (!abpEntityEntry.IsModified && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
@ -130,8 +134,6 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
DetectChanges(abpEntityEntry.EntityEntry, false); 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))) if (navigationEntry != null && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
{ {
navigationEntry.IsModified = true; navigationEntry.IsModified = true;

51
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEntityEntry.cs

@ -1,10 +1,8 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Metadata;
namespace Volo.Abp.EntityFrameworkCore.ChangeTrackers; namespace Volo.Abp.EntityFrameworkCore.ChangeTrackers;
@ -33,39 +31,30 @@ public class AbpEntityEntry
NavigationEntries = EntityEntry.Navigations.Select(x => new AbpNavigationEntry(x, x.Metadata.Name)).ToList(); 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) ?? if (IsModified ||
NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is ISkipNavigation skipNavigationMetadata && skipNavigationMetadata.ForeignKey == foreignKey); EntityEntry.State == EntityState.Modified ||
foreach (var navigationEntry in NavigationEntries) navigationEntry.IsModified)
{ {
if (IsModified || return;
EntityEntry.State == EntityState.Modified || }
navigationEntry.IsModified)
{
continue;
}
var currentValue = navigationEntry.NavigationEntry.CurrentValue; var currentValue = navigationEntry.NavigationEntry.CurrentValue;
if (currentValue == null) if (currentValue == null)
{ {
continue; return;
} }
if (navigationEntry.NavigationEntry is CollectionEntry) if (navigationEntry.NavigationEntry is CollectionEntry)
{ {
if (navigationEntry != entityEntryNavigationEntry) navigationEntry.OriginalValue ??= new List<object>();
{ var ls = navigationEntry.OriginalValue.As<List<object>>();
continue; ls.AddIfNotContains(entityEntry.Entity);
} }
navigationEntry.OriginalValue ??= new List<object>(); else
var ls = navigationEntry.OriginalValue.As<List<object>>(); {
ls.AddIfNotContains(entityEntry.Entity); navigationEntry.OriginalValue = currentValue;
}
else
{
navigationEntry.OriginalValue = currentValue;
}
} }
} }
} }

Loading…
Cancel
Save