diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3403OneToOne/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3403OneToOne/Fixture.cs new file mode 100644 index 00000000000..85c119e905c --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3403OneToOne/Fixture.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using System; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3403OneToOne +{ + using System.Threading.Tasks; + [TestFixture] + public class FixtureAsync : BugTestCase + { + private Guid _id; + + protected override void OnSetUp() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + var entity = new Entity1 + { + Child = new Entity2() + }; + + entity.Child.Parent = entity; + + session.Save(entity); + transaction.Commit(); + _id = entity.Id; + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + + [Test] + public async Task OrphanDeleteForDetachedOneToOneAsync() + { + Guid childId; + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var entity = await (session.GetAsync(_id)); + childId = entity.Child.Id; + await (session.EvictAsync(entity.Child)); + entity.Child = null; + + await (session.FlushAsync()); + await (transaction.CommitAsync()); + } + + using (var session = OpenSession()) + { + var entity = await (session.GetAsync(_id)); + Assert.That(entity, Is.Not.Null); + Assert.That(entity.Child, Is.Null, "Unexpected child on parent"); + + var child = await (session.GetAsync(childId)); + Assert.That(child , Is.Null, "Child is still in database"); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Entity.cs b/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Entity.cs new file mode 100644 index 00000000000..0bde7420b92 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Entity.cs @@ -0,0 +1,17 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.GH3403OneToOne +{ + public class Entity1 + { + public virtual Guid Id { get; set; } + + public virtual Entity2 Child { get; set; } + } + public class Entity2 + { + public virtual Guid Id { get; set; } + + public virtual Entity1 Parent { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Fixture.cs new file mode 100644 index 00000000000..08f965eef1d --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Fixture.cs @@ -0,0 +1,63 @@ +using System; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3403OneToOne +{ + [TestFixture] + public class Fixture : BugTestCase + { + private Guid _id; + + protected override void OnSetUp() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + var entity = new Entity1 + { + Child = new Entity2() + }; + + entity.Child.Parent = entity; + + session.Save(entity); + transaction.Commit(); + _id = entity.Id; + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + + [Test] + public void OrphanDeleteForDetachedOneToOne() + { + Guid childId; + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var entity = session.Get(_id); + childId = entity.Child.Id; + session.Evict(entity.Child); + entity.Child = null; + + session.Flush(); + transaction.Commit(); + } + + using (var session = OpenSession()) + { + var entity = session.Get(_id); + Assert.That(entity, Is.Not.Null); + Assert.That(entity.Child, Is.Null, "Unexpected child on parent"); + + var child = session.Get(childId); + Assert.That(child , Is.Null, "Child is still in database"); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Mappings.hbm.xml new file mode 100644 index 00000000000..175d587c0ce --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3403OneToOne/Mappings.hbm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + Parent + + + + + diff --git a/src/NHibernate/Async/Engine/Cascade.cs b/src/NHibernate/Async/Engine/Cascade.cs index c0165e5cf66..46877a36ae1 100644 --- a/src/NHibernate/Async/Engine/Cascade.cs +++ b/src/NHibernate/Async/Engine/Cascade.cs @@ -151,7 +151,7 @@ private async Task CascadePropertyAsync(object parent, object child, IType type, if (loadedValue != null) { - await (eventSource.DeleteAsync(entry.Persister.EntityName, loadedValue, false, null, cancellationToken)).ConfigureAwait(false); + await (eventSource.DeleteAsync(((EntityType) type).GetAssociatedEntityName(), loadedValue, false, null, cancellationToken)).ConfigureAwait(false); } } } diff --git a/src/NHibernate/Engine/Cascade.cs b/src/NHibernate/Engine/Cascade.cs index 2c2c2987a3b..35098331337 100644 --- a/src/NHibernate/Engine/Cascade.cs +++ b/src/NHibernate/Engine/Cascade.cs @@ -203,7 +203,7 @@ private void CascadeProperty(object parent, object child, IType type, CascadeSty if (loadedValue != null) { - eventSource.Delete(entry.Persister.EntityName, loadedValue, false, null); + eventSource.Delete(((EntityType) type).GetAssociatedEntityName(), loadedValue, false, null); } } }