diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH1760/MapKeyFormulaFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH1760/MapKeyFormulaFixture.cs
new file mode 100644
index 00000000000..2234a7a5b89
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH1760/MapKeyFormulaFixture.cs
@@ -0,0 +1,83 @@
+//------------------------------------------------------------------------------
+//
+// 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 System.Collections.Generic;
+using System.Linq;
+using NUnit.Framework;
+using NHibernate.Linq;
+
+namespace NHibernate.Test.NHSpecificTest.GH1760
+{
+ using System.Threading.Tasks;
+ [TestFixture]
+ public class MapKeyFormulasFixtureAsync : BugTestCase
+ {
+ protected override void OnSetUp()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ var bob =
+ new User
+ {
+ Name = "Bob"
+ };
+ session.Save(bob);
+
+ var sally =
+ new User
+ {
+ Name = "Sally"
+ };
+ session.Save(sally);
+
+ var g1 = new Group { Name = "Salesperson" };
+ session.Save(g1);
+
+ g1.UsersByName.Add(bob.Name, bob);
+ g1.UsersByName.Add(sally.Name, sally);
+
+ transaction.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ // HQL "delete from" does not handle foreign key order.
+ session.Delete("from User");
+ session.CreateQuery("delete System.Object").ExecuteUpdate();
+
+ transaction.Commit();
+ }
+ }
+
+ [Test]
+ public async Task CheckMapKeyAsync()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var salesperson = await (session.Query().SingleAsync(u => u.Name == "Salesperson"));
+
+ Assert.That(
+ salesperson.UsersByName,
+ Has.Count.EqualTo(2)
+ .And.One.Property(nameof(KeyValuePair.Key)).EqualTo("Bob")
+ .And.One.Property(nameof(KeyValuePair.Key)).EqualTo("Sally"));
+
+ await (tx.CommitAsync());
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1760/Domain.cs b/src/NHibernate.Test/NHSpecificTest/GH1760/Domain.cs
new file mode 100644
index 00000000000..576bc9c7900
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1760/Domain.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.GH1760
+{
+ class User
+ {
+ public virtual Guid Id { get; set; }
+ public virtual string Name { get; set; }
+ }
+
+ class Group
+ {
+ public virtual Guid Id { get; set; }
+ public virtual string Name { get; set; }
+
+ public virtual IDictionary UsersByName { get; set; } = new Dictionary();
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1760/MapKeyFormulaFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH1760/MapKeyFormulaFixture.cs
new file mode 100644
index 00000000000..9b7d9a828a3
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1760/MapKeyFormulaFixture.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH1760
+{
+ [TestFixture]
+ public class MapKeyFormulasFixture : BugTestCase
+ {
+ protected override void OnSetUp()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ var bob =
+ new User
+ {
+ Name = "Bob"
+ };
+ session.Save(bob);
+
+ var sally =
+ new User
+ {
+ Name = "Sally"
+ };
+ session.Save(sally);
+
+ var g1 = new Group { Name = "Salesperson" };
+ session.Save(g1);
+
+ g1.UsersByName.Add(bob.Name, bob);
+ g1.UsersByName.Add(sally.Name, sally);
+
+ transaction.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var session = OpenSession())
+ using (var transaction = session.BeginTransaction())
+ {
+ // HQL "delete from" does not handle foreign key order.
+ session.Delete("from User");
+ session.CreateQuery("delete System.Object").ExecuteUpdate();
+
+ transaction.Commit();
+ }
+ }
+
+ [Test]
+ public void CheckMapKey()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var salesperson = session.Query().Single(u => u.Name == "Salesperson");
+
+ Assert.That(
+ salesperson.UsersByName,
+ Has.Count.EqualTo(2)
+ .And.One.Property(nameof(KeyValuePair.Key)).EqualTo("Bob")
+ .And.One.Property(nameof(KeyValuePair.Key)).EqualTo("Sally"));
+
+ tx.Commit();
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH1760/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH1760/Mappings.hbm.xml
new file mode 100644
index 00000000000..309cf3b759c
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH1760/Mappings.hbm.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate/Persister/Collection/OneToManyPersister.cs b/src/NHibernate/Persister/Collection/OneToManyPersister.cs
index f87b2e60199..f88e1bd2bdf 100644
--- a/src/NHibernate/Persister/Collection/OneToManyPersister.cs
+++ b/src/NHibernate/Persister/Collection/OneToManyPersister.cs
@@ -76,7 +76,7 @@ protected override SqlCommandInfo GenerateDeleteString()
update.SetJoin(ownerPersister.TableName, KeyColumnNames, KeyType, JoinColumnNames, ownerPersister.GetPropertyColumnNames(CollectionType.LHSPropertyName));
}
- if (HasIndex)
+ if (HasIndex && !indexContainsFormula)
update.AddColumns(IndexColumnNames, "null");
if (HasWhere)