Skip to content

Commit

Permalink
Fix the issue with navigation collections SN-776
Browse files Browse the repository at this point in the history
  • Loading branch information
vasiliy-chefonov committed Feb 7, 2025
1 parent 4201c14 commit b190edc
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 24 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
using Microsoft.AspNetCore.Components;
using Saritasa.NetForge.Domain.UseCases.Interfaces;
using Saritasa.NetForge.Domain.UseCases.Metadata.GetEntityById;
using Saritasa.NetForge.Infrastructure.EfCore.Extensions;
using Saritasa.NetForge.Infrastructure.EfCore.Services;
using Saritasa.NetForge.Infrastructure.Helpers;

namespace Saritasa.NetForge.Controls.CustomFields;

Expand All @@ -24,7 +27,6 @@ public IEnumerable<T> PropertyValue

private IEnumerable<T> NavigationInstances { get; set; } = null!;


private GetEntityDto EntityMetadata { get; set; } = null!;

/// <inheritdoc />
Expand All @@ -37,7 +39,14 @@ protected override async Task OnInitializedAsync()
NavigationInstances = Service
.GetQuery(entityType)
.Cast<T>()
.OrderBy(instance => instance);
.OrderBy(instance => instance).ToList();

// In case of lazy loading - convert proxies to POCO instances.
if (NavigationInstances.Any() && NavigationInstances.First()!.GetType().IsLazyLoadingProxy())
{
NavigationInstances = NavigationInstances
.Select(instance => ProxyToPocoConverter.ConvertProxyToPoco(instance)).Cast<T>();
}

EntityMetadata = await EntityService.GetEntityByTypeAsync(entityType, CancellationToken.None);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,14 +240,7 @@ public async Task<object> UpdateAsync(
private async Task UpdateAsync(
DbContext dbContext, object entity, object originalEntity, CancellationToken cancellationToken)
{
try
{
dbContext.Attach(originalEntity);
}
catch (InvalidOperationException)
{
// Do nothing. It means that entity is already tracked.
}
dbContext.Attach(originalEntity);

await UpdateNavigations(dbContext, entity, originalEntity);

Expand Down Expand Up @@ -302,15 +295,13 @@ private static void UpdateNavigationReference(
}
else
{
try
var isTracked = dbContext.IsTracked(navigationEntry.CurrentValue!, comparer);

if (!isTracked)
{
dbContext.Attach(navigationEntry.CurrentValue!);
originalNavigationEntry.CurrentValue = navigationEntry.CurrentValue;
}
catch (InvalidOperationException)
{
// Do nothing. It means that entity is already tracked.
}
originalNavigationEntry.CurrentValue = navigationEntry.CurrentValue;
}
}

Expand All @@ -325,14 +316,12 @@ private static void UpdateNavigationCollection(
// Track added elements
foreach (var element in navigationCollectionInstance)
{
try
var isTracked = dbContext.IsTracked(element, comparer);

if (!isTracked)
{
dbContext.Attach(element);
}
catch (InvalidOperationException)
{
// Do nothing. It means that entity is already tracked.
}
}

var originalNavigationCollectionInstance = (IEnumerable<object>)originalNavigationEntry.CurrentValue!;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public static class ProxyToPocoConverter
/// <param name="source">The source proxy entity.</param>
/// <param name="navigationPropertyNames">The list of navigation property names.</param>
/// <returns>The POCO entity.</returns>
public static object? ConvertProxyToPoco(object? source, IList<string>? navigationPropertyNames)
public static object? ConvertProxyToPoco(object? source, IList<string>? navigationPropertyNames = null)
{
switch (source)
{
Expand All @@ -33,7 +33,7 @@ public static class ProxyToPocoConverter

foreach (var item in sourceCollection)
{
pocoCollection.Add(ConvertProxyToPoco(item, null));
pocoCollection.Add(ConvertProxyToPoco(item));
}
return pocoCollection;
}
Expand Down Expand Up @@ -103,7 +103,7 @@ public static class ProxyToPocoConverter
continue;
}

var navigationPoco = ConvertProxyToPoco(propertyValue, null);
var navigationPoco = ConvertProxyToPoco(propertyValue);
entityType.GetProperty(navigationName)?.SetValue(pocoInstance, navigationPoco);
}

Expand Down

0 comments on commit b190edc

Please sign in to comment.