diff --git a/LANCommander.Server.Data/UpdateEntityContext.cs b/LANCommander.Server.Data/UpdateEntityContext.cs index 6f1610ec..5f5c0525 100644 --- a/LANCommander.Server.Data/UpdateEntityContext.cs +++ b/LANCommander.Server.Data/UpdateEntityContext.cs @@ -96,10 +96,22 @@ public class UpdateEntityContext // Get the list of tracked entities from the context var trackedEntities = _context.Set().Local; - // Replace entities with tracked instances to avoid duplicate tracking - var updatedTrackedEntities = updatedEntities - .Select(e => trackedEntities.FirstOrDefault(t => t.Id == e.Id) ?? e) - .ToList(); + // Replace entities with tracked instances to avoid duplicate tracking. + // For entities that aren't already tracked locally, fetch the tracked + // instance from the database instead of attaching the detached incoming + // instance. Attaching a detached instance would pull in its nested + // navigation graph (e.g. Archive.StorageLocation), and two entities that + // share the same related key would trigger an identity-conflict. + var updatedTrackedEntities = new List(); + + foreach (var updatedEntity in updatedEntities) + { + var trackedEntity = trackedEntities.FirstOrDefault(t => t.Id == updatedEntity.Id) + ?? await _context.Set().FirstOrDefaultAsync(t => t.Id == updatedEntity.Id) + ?? updatedEntity; + + updatedTrackedEntities.Add(trackedEntity); + } // Update values for existing entities first foreach (var existingEntity in existingEntities)