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);
}
}
}