@@ -12,8 +12,13 @@ namespace NHibernate.Engine
1212 /// and the identifier space (eg. tablename)
1313 /// </summary>
1414 [ Serializable ]
15- public sealed class EntityKey : IDeserializationCallback , ISerializable , IEquatable < EntityKey >
15+ public struct EntityKey : ISerializable , IEquatable < EntityKey >
1616 {
17+ public static EntityKey Null { get ; } = new EntityKey ( ) ;
18+
19+ public bool IsNull => identifier == null ;
20+ public bool IsNotNull => ! IsNull ;
21+
1722 private readonly object identifier ;
1823 private readonly IEntityPersister _persister ;
1924 // hashcode may vary among processes, they cannot be stored and have to be re-computed after deserialization
@@ -30,8 +35,16 @@ public EntityKey(object id, IEntityPersister persister)
3035 private EntityKey ( SerializationInfo info , StreamingContext context )
3136 {
3237 identifier = info . GetValue ( nameof ( Identifier ) , typeof ( object ) ) ;
38+ if ( identifier == null )
39+ {
40+ _hashCode = 0 ;
41+ _persister = null ;
42+ return ;
43+ }
44+
3345 var factory = ( ISessionFactoryImplementor ) info . GetValue ( nameof ( _persister . Factory ) , typeof ( ISessionFactoryImplementor ) ) ;
34- var entityName = ( string ) info . GetValue ( nameof ( EntityName ) , typeof ( string ) ) ;
46+ var entityName = info . GetString ( nameof ( EntityName ) ) ;
47+
3548 _persister = factory . GetEntityPersister ( entityName ) ;
3649 _hashCode = GenerateHashCode ( _persister , identifier ) ;
3750 }
@@ -54,10 +67,8 @@ public override bool Equals(object other)
5467
5568 public bool Equals ( EntityKey other )
5669 {
57- if ( other == null )
58- {
59- return false ;
60- }
70+ if ( other . IsNull )
71+ return IsNull ;
6172
6273 return
6374 other . RootEntityName . Equals ( RootEntityName )
@@ -82,13 +93,18 @@ private static int GenerateHashCode(IEntityPersister persister, object id)
8293
8394 public override string ToString ( )
8495 {
85- return "EntityKey" + MessageHelper . InfoString ( _persister , Identifier , _persister . Factory ) ;
96+ return IsNull
97+ ? Util . StringHelper . NullObject
98+ : "EntityKey" + MessageHelper . InfoString ( _persister , Identifier , _persister ? . Factory ) ;
8699 }
87100
88101 [ SecurityCritical ]
89102 void ISerializable . GetObjectData ( SerializationInfo info , StreamingContext context )
90103 {
91104 info . AddValue ( nameof ( Identifier ) , identifier ) ;
105+ if ( identifier == null )
106+ return ;
107+
92108 info . AddValue ( nameof ( _persister . Factory ) , _persister . Factory ) ;
93109 info . AddValue ( nameof ( EntityName ) , EntityName ) ;
94110 }
0 commit comments