diff --git a/src/SIL.LCModel/DomainImpl/OverridesLing_Lex.cs b/src/SIL.LCModel/DomainImpl/OverridesLing_Lex.cs index 89e99c0c..1a0802ec 100644 --- a/src/SIL.LCModel/DomainImpl/OverridesLing_Lex.cs +++ b/src/SIL.LCModel/DomainImpl/OverridesLing_Lex.cs @@ -2279,6 +2279,17 @@ internal override void RegisterVirtualsModifiedForObjectDeletion(IUnitOfWorkServ Cache.ServiceLocator.GetInstance().LexDbEntries, () => cache.ServiceLocator.GetInstance().AllInstances(), new ILexEntry[0], new[] { this }); + // Remove all the virtual ordering objects that refer to this entry. + UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Undo Remove Entry VOs", + "Redo Remove Entry VOs", + Cache.ActionHandlerAccessor, + () => + { + var virtualOrderingObjects = Cache.ServiceLocator + .GetInstance().AllInstances().Where(vo => vo.SourceRA == this); + foreach (var vo in virtualOrderingObjects) + vo.Delete(); + }); base.RegisterVirtualsModifiedForObjectDeletion(uow); } diff --git a/tests/SIL.LCModel.Tests/DomainImpl/LexEntryTests.cs b/tests/SIL.LCModel.Tests/DomainImpl/LexEntryTests.cs index 79674bc2..18df7b9a 100644 --- a/tests/SIL.LCModel.Tests/DomainImpl/LexEntryTests.cs +++ b/tests/SIL.LCModel.Tests/DomainImpl/LexEntryTests.cs @@ -213,6 +213,39 @@ public void MorphBundleRefsFixedWhenSenseMovedToNewEntry() Assert.That(mbBankStream.MorphRA, Is.EqualTo(newEntry.AlternateFormsOS[1]), "The morph for the stream analysis should be the new allomorph"); } + /// + /// Test that a virtual ordering is removed the entry that owns it is deleted + /// + [Test] + public void VerifyVirtualOrderingRemoved() + { + ILexEntry kick = null; + ILexEntry bucket = null; + ILexEntry kickBucket = null; + UndoableUnitOfWorkHelper.Do("doit", "undoit", Cache.ActionHandlerAccessor, + () => + { + kick = MakeEntryWithForm("kick"); + bucket = MakeEntryWithForm("bucket"); + kickBucket = MakeEntryWithForm("kick the bucket"); + kickBucket.AddComponent(kick); + kickBucket.AddComponent(bucket); + var vof = Cache.ServiceLocator.GetInstance(); + vof.Create(kick, "VisibleComplexFormBackRefs", new []{bucket, kickBucket}); + }); + var entryRef = kickBucket.EntryRefsOS[0]; + Assert.That(entryRef.PrimaryLexemesRS[0], Is.EqualTo(kick)); + var vos = Cache.ServiceLocator.GetInstance(); + Assert.That(vos.Count, Is.EqualTo(1)); + UndoableUnitOfWorkHelper.Do("doit", "undoit", Cache.ActionHandlerAccessor, + () => + { + kick.Delete(); + }); + Cache.ServiceLocator.GetInstance(); + Assert.That(vos.Count, Is.EqualTo(0)); + } + /// /// Ensure references are corrected when moving a sense between two existing entries ///