1
1
using System ;
2
2
using System . Runtime . Serialization ;
3
+ using System . Security ;
3
4
using NHibernate . Impl ;
4
5
using NHibernate . Persister . Entity ;
5
6
using NHibernate . Type ;
@@ -11,73 +12,56 @@ namespace NHibernate.Engine
11
12
/// and the identifier space (eg. tablename)
12
13
/// </summary>
13
14
[ Serializable ]
14
- public sealed class EntityKey : IDeserializationCallback
15
+ public sealed class EntityKey : IDeserializationCallback , ISerializable , IEquatable < EntityKey >
15
16
{
16
17
private readonly object identifier ;
17
- private readonly string rootEntityName ;
18
- private readonly string entityName ;
19
- private readonly IType identifierType ;
20
- private readonly bool isBatchLoadable ;
21
-
22
- private ISessionFactoryImplementor factory ;
18
+ private readonly IEntityPersister _persister ;
23
19
// hashcode may vary among processes, they cannot be stored and have to be re-computed after deserialization
24
20
[ NonSerialized ]
25
21
private int ? _hashCode ;
26
22
27
23
/// <summary> Construct a unique identifier for an entity class instance</summary>
28
24
public EntityKey ( object id , IEntityPersister persister )
29
- : this ( id , persister . RootEntityName , persister . EntityName , persister . IdentifierType , persister . IsBatchLoadable , persister . Factory ) { }
30
-
31
- /// <summary> Used to reconstruct an EntityKey during deserialization. </summary>
32
- /// <param name="identifier">The identifier value </param>
33
- /// <param name="rootEntityName">The root entity name </param>
34
- /// <param name="entityName">The specific entity name </param>
35
- /// <param name="identifierType">The type of the identifier value </param>
36
- /// <param name="batchLoadable">Whether represented entity is eligible for batch loading </param>
37
- /// <param name="factory">The session factory </param>
38
- private EntityKey ( object identifier , string rootEntityName , string entityName , IType identifierType , bool batchLoadable , ISessionFactoryImplementor factory )
39
25
{
40
- if ( identifier == null )
41
- throw new AssertionFailure ( "null identifier" ) ;
42
-
43
- this . identifier = identifier ;
44
- this . rootEntityName = rootEntityName ;
45
- this . entityName = entityName ;
46
- this . identifierType = identifierType ;
47
- isBatchLoadable = batchLoadable ;
48
- this . factory = factory ;
49
-
26
+ identifier = id ?? throw new AssertionFailure ( "null identifier" ) ;
27
+ _persister = persister ;
50
28
_hashCode = GenerateHashCode ( ) ;
51
29
}
52
30
53
- public bool IsBatchLoadable
31
+ private EntityKey ( SerializationInfo info , StreamingContext context )
54
32
{
55
- get { return isBatchLoadable ; }
33
+ identifier = info . GetValue ( nameof ( Identifier ) , typeof ( object ) ) ;
34
+ var factory = ( ISessionFactoryImplementor ) info . GetValue ( nameof ( _persister . Factory ) , typeof ( ISessionFactoryImplementor ) ) ;
35
+ var entityName = ( string ) info . GetValue ( nameof ( EntityName ) , typeof ( string ) ) ;
36
+ _persister = factory . GetEntityPersister ( entityName ) ;
56
37
}
57
38
39
+ public bool IsBatchLoadable => _persister . IsBatchLoadable ;
40
+
58
41
public object Identifier
59
42
{
60
43
get { return identifier ; }
61
44
}
62
45
63
- public string EntityName
64
- {
65
- get { return entityName ; }
66
- }
46
+ public string EntityName => _persister . EntityName ;
47
+
48
+ internal string RootEntityName => _persister . RootEntityName ;
67
49
68
- internal string RootEntityName
50
+ public override bool Equals ( object other )
69
51
{
70
- get { return rootEntityName ; }
52
+ return other is EntityKey otherKey && Equals ( otherKey ) ;
71
53
}
72
54
73
- public override bool Equals ( object other )
55
+ public bool Equals ( EntityKey other )
74
56
{
75
- var otherKey = other as EntityKey ;
76
- if ( otherKey == null ) return false ;
57
+ if ( other == null )
58
+ {
59
+ return false ;
60
+ }
77
61
78
62
return
79
- otherKey . rootEntityName . Equals ( rootEntityName )
80
- && identifierType . IsEqual ( otherKey . Identifier , Identifier , factory ) ;
63
+ other . RootEntityName . Equals ( RootEntityName )
64
+ && _persister . IdentifierType . IsEqual ( other . Identifier , Identifier , _persister . Factory ) ;
81
65
}
82
66
83
67
public override int GetHashCode ( )
@@ -100,15 +84,23 @@ private int GenerateHashCode()
100
84
int result = 17 ;
101
85
unchecked
102
86
{
103
- result = 37 * result + rootEntityName . GetHashCode ( ) ;
104
- result = 37 * result + identifierType . GetHashCode ( identifier , factory ) ;
87
+ result = 37 * result + RootEntityName . GetHashCode ( ) ;
88
+ result = 37 * result + _persister . IdentifierType . GetHashCode ( identifier , _persister . Factory ) ;
105
89
}
106
90
return result ;
107
91
}
108
92
109
93
public override string ToString ( )
110
94
{
111
- return "EntityKey" + MessageHelper . InfoString ( factory . GetEntityPersister ( EntityName ) , Identifier , factory ) ;
95
+ return "EntityKey" + MessageHelper . InfoString ( _persister , Identifier , _persister . Factory ) ;
96
+ }
97
+
98
+ [ SecurityCritical ]
99
+ public void GetObjectData ( SerializationInfo info , StreamingContext context )
100
+ {
101
+ info . AddValue ( nameof ( Identifier ) , identifier ) ;
102
+ info . AddValue ( nameof ( _persister . Factory ) , _persister . Factory ) ;
103
+ info . AddValue ( nameof ( EntityName ) , EntityName ) ;
112
104
}
113
105
}
114
106
}
0 commit comments