Skip to content

Commit a1d631d

Browse files
Avoid dealing with proxies inside the persister
1 parent 660dcd3 commit a1d631d

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

src/NHibernate/Async/Engine/ForeignKeys.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,29 @@ public static async Task<bool> IsNotTransientSlowAsync(string entityName, object
181181
return false;
182182
}
183183

184-
if (entity is INHibernateProxy proxy && proxy.HibernateLazyInitializer.IsUninitialized)
184+
var proxy = entity as INHibernateProxy;
185+
if (proxy?.HibernateLazyInitializer.IsUninitialized == true)
185186
{
186187
return false;
187188
}
188189

189190
// let the interceptor inspect the instance to decide
191+
var interceptorResult = session.Interceptor.IsTransient(entity);
192+
if (interceptorResult.HasValue)
193+
return interceptorResult;
194+
190195
// let the persister inspect the instance to decide
191-
return session.Interceptor.IsTransient(entity) ??
192-
await (session.GetEntityPersister(entityName, entity).IsTransientAsync(entity, session, cancellationToken)).ConfigureAwait(false);
196+
if (proxy != null)
197+
{
198+
// The persister only deals with unproxied entities.
199+
entity = await (proxy.HibernateLazyInitializer.GetImplementationAsync(cancellationToken)).ConfigureAwait(false);
200+
}
201+
202+
return await (session
203+
.GetEntityPersister(
204+
entityName,
205+
entity)
206+
.IsTransientAsync(entity, session, cancellationToken)).ConfigureAwait(false);
193207
}
194208

195209
/// <summary>

src/NHibernate/Engine/ForeignKeys.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,15 +178,29 @@ public static bool IsNotTransientSlow(string entityName, object entity, ISession
178178
return false;
179179
}
180180

181-
if (entity is INHibernateProxy proxy && proxy.HibernateLazyInitializer.IsUninitialized)
181+
var proxy = entity as INHibernateProxy;
182+
if (proxy?.HibernateLazyInitializer.IsUninitialized == true)
182183
{
183184
return false;
184185
}
185186

186187
// let the interceptor inspect the instance to decide
188+
var interceptorResult = session.Interceptor.IsTransient(entity);
189+
if (interceptorResult.HasValue)
190+
return interceptorResult;
191+
187192
// let the persister inspect the instance to decide
188-
return session.Interceptor.IsTransient(entity) ??
189-
session.GetEntityPersister(entityName, entity).IsTransient(entity, session);
193+
if (proxy != null)
194+
{
195+
// The persister only deals with unproxied entities.
196+
entity = proxy.HibernateLazyInitializer.GetImplementation();
197+
}
198+
199+
return session
200+
.GetEntityPersister(
201+
entityName,
202+
entity)
203+
.IsTransient(entity, session);
190204
}
191205

192206
/// <summary>

src/NHibernate/Tuple/Entity/AbstractEntityTuplizer.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,6 @@ public object Instantiate(object id)
114114

115115
public object GetIdentifier(object entity)
116116
{
117-
if (entity is INHibernateProxy proxy)
118-
{
119-
return proxy.HibernateLazyInitializer.Identifier;
120-
}
121-
122117
object id;
123118
if (entityMetamodel.IdentifierProperty.IsEmbedded)
124119
{

0 commit comments

Comments
 (0)