Skip to content

Commit 8d02bd0

Browse files
Fix #2608
1 parent 8b50340 commit 8d02bd0

File tree

7 files changed

+33
-4
lines changed

7 files changed

+33
-4
lines changed

src/NHibernate/Action/DelayedPostInsertIdentifier.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,10 @@ public override string ToString()
4545
{
4646
return string.Format("<delayed:{0}>", sequence);
4747
}
48+
49+
/// <summary>
50+
/// The actual identifier value that has been generated.
51+
/// </summary>
52+
public object ActualId { get; set; }
4853
}
4954
}

src/NHibernate/Action/EntityInsertAction.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,16 @@ public override void Execute()
4444

4545
bool veto = PreInsert();
4646

47+
var isDelayed = false;
4748
// Don't need to lock the cache here, since if someone
4849
// else inserted the same pk first, the insert would fail
4950
if (!veto)
5051
{
52+
if (id is DelayedPostInsertIdentifier delayed && delayed.ActualId != null)
53+
{
54+
isDelayed = true;
55+
id = delayed.ActualId;
56+
}
5157
persister.Insert(id, State, instance, Session);
5258

5359
EntityEntry entry = Session.PersistenceContext.GetEntry(instance);
@@ -57,6 +63,10 @@ public override void Execute()
5763
}
5864

5965
entry.PostInsert();
66+
if (isDelayed)
67+
{
68+
Session.PersistenceContext.ReplaceDelayedEntityIdentityInsertKeys(entry.EntityKey, id);
69+
}
6070

6171
if (persister.HasInsertGeneratedProperties)
6272
{

src/NHibernate/Async/Action/EntityInsertAction.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,16 @@ public override async Task ExecuteAsync(CancellationToken cancellationToken)
4040

4141
bool veto = await (PreInsertAsync(cancellationToken)).ConfigureAwait(false);
4242

43+
var isDelayed = false;
4344
// Don't need to lock the cache here, since if someone
4445
// else inserted the same pk first, the insert would fail
4546
if (!veto)
4647
{
48+
if (id is DelayedPostInsertIdentifier delayed && delayed.ActualId != null)
49+
{
50+
isDelayed = true;
51+
id = delayed.ActualId;
52+
}
4753
await (persister.InsertAsync(id, State, instance, Session, cancellationToken)).ConfigureAwait(false);
4854

4955
EntityEntry entry = Session.PersistenceContext.GetEntry(instance);
@@ -53,6 +59,10 @@ public override async Task ExecuteAsync(CancellationToken cancellationToken)
5359
}
5460

5561
entry.PostInsert();
62+
if (isDelayed)
63+
{
64+
Session.PersistenceContext.ReplaceDelayedEntityIdentityInsertKeys(entry.EntityKey, id);
65+
}
5666

5767
if (persister.HasInsertGeneratedProperties)
5868
{

src/NHibernate/Async/Engine/StatefulPersistenceContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
using System.Collections.Generic;
1414
using System.Runtime.Serialization;
1515
using System.Security;
16-
using System.Security.Permissions;
1716
using System.Text;
17+
using NHibernate.Action;
1818
using NHibernate.Collection;
1919
using NHibernate.Engine.Loading;
2020
using NHibernate.Impl;

src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ protected virtual async Task<object> PerformSaveAsync(object entity, object id,
146146
throw new NonUniqueObjectException(id, persister.EntityName);
147147
}
148148
}
149-
persister.SetIdentifier(entity, id);
149+
if (!(id is DelayedPostInsertIdentifier))
150+
persister.SetIdentifier(entity, id);
150151
}
151152
else
152153
{

src/NHibernate/Engine/StatefulPersistenceContext.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
using System.Collections.Generic;
44
using System.Runtime.Serialization;
55
using System.Security;
6-
using System.Security.Permissions;
76
using System.Text;
7+
using NHibernate.Action;
88
using NHibernate.Collection;
99
using NHibernate.Engine.Loading;
1010
using NHibernate.Impl;
@@ -1392,6 +1392,8 @@ public void ReplaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, object gene
13921392
AddEntity(newKey, entity);
13931393
AddEntry(entity, oldEntry.Status, oldEntry.LoadedState, oldEntry.RowId, generatedId, oldEntry.Version,
13941394
oldEntry.LockMode, oldEntry.ExistsInDatabase, oldEntry.Persister, oldEntry.IsBeingReplicated);
1395+
if (oldKey.Identifier is DelayedPostInsertIdentifier delayed)
1396+
delayed.ActualId = generatedId;
13951397
}
13961398

13971399
public bool IsLoadFinished

src/NHibernate/Event/Default/AbstractSaveEventListener.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ protected virtual object PerformSave(object entity, object id, IEntityPersister
173173
throw new NonUniqueObjectException(id, persister.EntityName);
174174
}
175175
}
176-
persister.SetIdentifier(entity, id);
176+
if (!(id is DelayedPostInsertIdentifier))
177+
persister.SetIdentifier(entity, id);
177178
}
178179
else
179180
{

0 commit comments

Comments
 (0)