using System.Collections.Generic; using System.Linq; using Comal.Classes; using InABox.Core; using System; namespace Comal.Stores { public class EquipmentStore : SchedulableStore { protected override void AfterSave(Equipment entity) { UpdateLinkedTracker(entity); base.AfterSave(entity); } private void UpdateLinkedTracker(Equipment entity) { if (entity.TrackerLink.HasOriginalValue(x => x.ID)) { var oldID = entity.TrackerLink.GetOriginalValue(x => x.ID); var newID = entity.TrackerLink.ID; // If there are any other equipment items with the same tracker // blank them out - a tracker can only be attached to one equipment item var equips = Provider.Query( new Filter(x => x.TrackerLink.ID).IsEqualTo(newID).And(x => x.ID) .IsNotEqualTo(entity.ID), Columns.None().Add(x => x.ID).Add(x => x.TrackerLink.ID) ).ToList(); if (equips.Any()) { foreach (var equip in equips) equip.TrackerLink.ID = Guid.Empty; Provider.Save(equips); } var trackers = Provider.Query( new Filter(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID).Or(x=>x.Equipment.ID).IsEqualTo(entity.ID), Columns.None().Add(x => x.ID, x => x.Equipment.ID) ).ToList(); // If there are any other trackers attached to this equipment item, // clear them out - an equipment item can only have one tracker foreach (var tracker in trackers) tracker.Equipment.ID = Guid.Empty; // Update the equipment item with the new Tracker ID var curr = trackers.FirstOrDefault(x => x.ID.Equals(newID)); if (curr != null) curr.Equipment.ID = entity.ID; // Save any changes if (trackers.Any(x=>x.IsChanged())) Provider.Save(trackers); } } } }