3
3
using System . Security ;
4
4
using NHibernate . Impl ;
5
5
using NHibernate . Persister . Entity ;
6
- using NHibernate . Type ;
7
6
8
7
namespace NHibernate . Engine
9
8
{
@@ -12,20 +11,19 @@ namespace NHibernate.Engine
12
11
/// and the identifier space (eg. tablename)
13
12
/// </summary>
14
13
[ Serializable ]
15
- public sealed class EntityKey : IDeserializationCallback , ISerializable , IEquatable < EntityKey >
14
+ public sealed class EntityKey : ISerializable , IEquatable < EntityKey >
16
15
{
17
16
private readonly object identifier ;
18
17
private readonly IEntityPersister _persister ;
19
18
// hashcode may vary among processes, they cannot be stored and have to be re-computed after deserialization
20
- [ NonSerialized ]
21
- private int ? _hashCode ;
19
+ private readonly int _hashCode ;
22
20
23
21
/// <summary> Construct a unique identifier for an entity class instance</summary>
24
22
public EntityKey ( object id , IEntityPersister persister )
25
23
{
26
24
identifier = id ?? throw new AssertionFailure ( "null identifier" ) ;
27
25
_persister = persister ;
28
- _hashCode = GenerateHashCode ( ) ;
26
+ _hashCode = GenerateHashCode ( persister , id ) ;
29
27
}
30
28
31
29
private EntityKey ( SerializationInfo info , StreamingContext context )
@@ -34,6 +32,7 @@ private EntityKey(SerializationInfo info, StreamingContext context)
34
32
var factory = ( ISessionFactoryImplementor ) info . GetValue ( nameof ( _persister . Factory ) , typeof ( ISessionFactoryImplementor ) ) ;
35
33
var entityName = ( string ) info . GetValue ( nameof ( EntityName ) , typeof ( string ) ) ;
36
34
_persister = factory . GetEntityPersister ( entityName ) ;
35
+ _hashCode = GenerateHashCode ( _persister , identifier ) ;
37
36
}
38
37
39
38
public bool IsBatchLoadable => _persister . IsBatchLoadable ;
@@ -66,26 +65,16 @@ public bool Equals(EntityKey other)
66
65
67
66
public override int GetHashCode ( )
68
67
{
69
- // If the object is put in a set or dictionary during deserialization, the hashcode will not yet be
70
- // computed. Compute the hashcode on the fly. So long as this happens only during deserialization, there
71
- // will be no thread safety issues. For the hashcode to be always defined after deserialization, the
72
- // deserialization callback is used.
73
- return _hashCode ?? GenerateHashCode ( ) ;
68
+ return _hashCode ;
74
69
}
75
70
76
- /// <inheritdoc />
77
- public void OnDeserialization ( object sender )
78
- {
79
- _hashCode = GenerateHashCode ( ) ;
80
- }
81
-
82
- private int GenerateHashCode ( )
71
+ private static int GenerateHashCode ( IEntityPersister persister , object id )
83
72
{
84
73
int result = 17 ;
85
74
unchecked
86
75
{
87
- result = 37 * result + RootEntityName . GetHashCode ( ) ;
88
- result = 37 * result + _persister . IdentifierType . GetHashCode ( identifier , _persister . Factory ) ;
76
+ result = 37 * result + persister . RootEntityName . GetHashCode ( ) ;
77
+ result = 37 * result + persister . IdentifierType . GetHashCode ( id , persister . Factory ) ;
89
78
}
90
79
return result ;
91
80
}
0 commit comments