From 15bf5cefdab5e5ddcb40ae8fb0cbcb4e645cd606 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Tue, 15 Jan 2019 09:54:18 +0200 Subject: [PATCH 1/5] Convert EntityKey to struct --- .../Action/EntityIdentityInsertAction.cs | 2 +- .../Default/AbstractSaveEventListener.cs | 4 +-- .../Default/DefaultReplicateEventListener.cs | 2 +- .../Async/Impl/MultiCriteriaImpl.cs | 2 +- src/NHibernate/Async/Loader/Loader.cs | 10 +++---- src/NHibernate/Engine/EntityEntry.cs | 2 +- src/NHibernate/Engine/EntityKey.cs | 30 ++++++++++++++----- .../Engine/StatefulPersistenceContext.cs | 2 +- .../Default/AbstractSaveEventListener.cs | 4 +-- .../Default/DefaultReplicateEventListener.cs | 2 +- src/NHibernate/Impl/MultiCriteriaImpl.cs | 2 +- src/NHibernate/Loader/Loader.cs | 18 +++++------ .../Proxy/AbstractLazyInitializer.cs | 6 ++-- src/NHibernate/Util/StringHelper.cs | 11 +++++-- 14 files changed, 60 insertions(+), 37 deletions(-) diff --git a/src/NHibernate/Action/EntityIdentityInsertAction.cs b/src/NHibernate/Action/EntityIdentityInsertAction.cs index b796bf2be77..f517c3e809d 100644 --- a/src/NHibernate/Action/EntityIdentityInsertAction.cs +++ b/src/NHibernate/Action/EntityIdentityInsertAction.cs @@ -19,7 +19,7 @@ public EntityIdentityInsertAction(object[] state, object instance, IEntityPersis : base(null, state, instance, persister, session) { this.isDelayed = isDelayed; - delayedEntityKey = this.isDelayed ? GenerateDelayedEntityKey() : null; + delayedEntityKey = this.isDelayed ? GenerateDelayedEntityKey() : EntityKey.Null; } public object GeneratedId diff --git a/src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs b/src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs index 985ead87deb..c586c15e6b9 100644 --- a/src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs +++ b/src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs @@ -150,7 +150,7 @@ protected virtual async Task PerformSaveAsync(object entity, object id, } else { - key = null; + key = EntityKey.Null; } if (InvokeSaveLifecycle(entity, persister, source)) @@ -184,7 +184,7 @@ protected virtual async Task PerformSaveOrReplicateAsync(object entity, cancellationToken.ThrowIfCancellationRequested(); Validate(entity, persister, source); - object id = key == null ? null : key.Identifier; + object id = key.IsNull ? null : key.Identifier; bool shouldDelayIdentityInserts = !requiresImmediateIdAccess; diff --git a/src/NHibernate/Async/Event/Default/DefaultReplicateEventListener.cs b/src/NHibernate/Async/Event/Default/DefaultReplicateEventListener.cs index 124f45d1755..006356c3da2 100644 --- a/src/NHibernate/Async/Event/Default/DefaultReplicateEventListener.cs +++ b/src/NHibernate/Async/Event/Default/DefaultReplicateEventListener.cs @@ -102,7 +102,7 @@ public virtual async Task OnReplicateAsync(ReplicateEvent @event, CancellationTo } bool regenerate = persister.IsIdentifierAssignedByInsert; // prefer re-generation of identity! - EntityKey key = regenerate ? null : source.GenerateEntityKey(id, persister); + EntityKey key = regenerate ? EntityKey.Null : source.GenerateEntityKey(id, persister); await (PerformSaveOrReplicateAsync(entity, key, persister, regenerate, replicationMode, source, true, cancellationToken)).ConfigureAwait(false); } diff --git a/src/NHibernate/Async/Impl/MultiCriteriaImpl.cs b/src/NHibernate/Async/Impl/MultiCriteriaImpl.cs index 3f063cf00e6..da6c3364d5d 100644 --- a/src/NHibernate/Async/Impl/MultiCriteriaImpl.cs +++ b/src/NHibernate/Async/Impl/MultiCriteriaImpl.cs @@ -185,7 +185,7 @@ private async Task GetResultsFromDatabaseAsync(IList results, CancellationToken object o = await (loader.GetRowFromResultSetAsync(reader, session, queryParameters, loader.GetLockModes(queryParameters.LockModes), - null, hydratedObjects[i], keys, true, + EntityKey.Null, hydratedObjects[i], keys, true, (persister, data) => cacheBatcher.AddToBatch(persister, data), cancellationToken)).ConfigureAwait(false); if (createSubselects[i]) { diff --git a/src/NHibernate/Async/Loader/Loader.cs b/src/NHibernate/Async/Loader/Loader.cs index bf7d06b1046..05bb14b9451 100644 --- a/src/NHibernate/Async/Loader/Loader.cs +++ b/src/NHibernate/Async/Loader/Loader.cs @@ -118,7 +118,7 @@ protected async Task LoadSingleRowAsync(DbDataReader resultSet, ISession try { result = - await (GetRowFromResultSetAsync(resultSet, session, queryParameters, GetLockModes(queryParameters.LockModes), null, + await (GetRowFromResultSetAsync(resultSet, session, queryParameters, GetLockModes(queryParameters.LockModes), EntityKey.Null, hydratedObjects, new EntityKey[entitySpan], returnProxies, (persister, data) => cacheBatcher.AddToBatch(persister, data), cancellationToken)).ConfigureAwait(false); } catch (OperationCanceledException) { throw; } @@ -185,7 +185,7 @@ internal async Task GetRowFromResultSetAsync(DbDataReader resultSet, ISe { object entity = row[i]; var key = keys[i]; - if (entity == null && key != null && IsChildFetchEntity(i)) + if (entity == null && key.IsNotNull && IsChildFetchEntity(i)) { // The entity was missing in the session, fallback on internal load (which will just yield a // proxy if the persister supports it). @@ -564,7 +564,7 @@ private async Task GetKeyFromResultSetAsync(int i, IEntityPersister p } } - return resultId == null ? null : session.GenerateEntityKey(resultId, persister); + return resultId == null ? EntityKey.Null : session.GenerateEntityKey(resultId, persister); } /// @@ -620,7 +620,7 @@ private async Task GetRowAsync(DbDataReader rs, ILoadable[] persisters object obj = null; EntityKey key = keys[i]; - if (key == null) + if (key.IsNull) { // do nothing /* TODO NH-1001 : if (persisters[i]...EntityType) is an OneToMany or a ManyToOne and @@ -756,7 +756,7 @@ private async Task InstanceNotYetLoadedAsync(DbDataReader dr, int i, ILo string instanceClass = await (GetInstanceClassAsync(dr, i, persister, key.Identifier, session, cancellationToken)).ConfigureAwait(false); - if (optionalObjectKey != null && key.Equals(optionalObjectKey)) + if (optionalObjectKey.IsNotNull && key.Equals(optionalObjectKey)) { // its the given optional object obj = optionalObject; diff --git a/src/NHibernate/Engine/EntityEntry.cs b/src/NHibernate/Engine/EntityEntry.cs index ac702632adb..361d35e7d87 100644 --- a/src/NHibernate/Engine/EntityEntry.cs +++ b/src/NHibernate/Engine/EntityEntry.cs @@ -215,7 +215,7 @@ public EntityKey EntityKey { get { - if (cachedEntityKey == null) + if (cachedEntityKey.IsNull) { if (id == null) throw new InvalidOperationException("cannot generate an EntityKey when id is null."); diff --git a/src/NHibernate/Engine/EntityKey.cs b/src/NHibernate/Engine/EntityKey.cs index 443ca3e2d40..1c18bc0036e 100644 --- a/src/NHibernate/Engine/EntityKey.cs +++ b/src/NHibernate/Engine/EntityKey.cs @@ -12,8 +12,13 @@ namespace NHibernate.Engine /// and the identifier space (eg. tablename) /// [Serializable] - public sealed class EntityKey : IDeserializationCallback, ISerializable, IEquatable + public struct EntityKey : ISerializable, IEquatable { + public static EntityKey Null { get; } = new EntityKey(); + + public bool IsNull => identifier == null; + public bool IsNotNull => !IsNull; + private readonly object identifier; private readonly IEntityPersister _persister; // 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) private EntityKey(SerializationInfo info, StreamingContext context) { identifier = info.GetValue(nameof(Identifier), typeof(object)); + if (identifier == null) + { + _hashCode = 0; + _persister = null; + return; + } + var factory = (ISessionFactoryImplementor) info.GetValue(nameof(_persister.Factory), typeof(ISessionFactoryImplementor)); - var entityName = (string) info.GetValue(nameof(EntityName), typeof(string)); + var entityName = info.GetString(nameof(EntityName)); + _persister = factory.GetEntityPersister(entityName); _hashCode = GenerateHashCode(_persister, identifier); } @@ -54,10 +67,8 @@ public override bool Equals(object other) public bool Equals(EntityKey other) { - if (other == null) - { - return false; - } + if (other.IsNull) + return IsNull; return other.RootEntityName.Equals(RootEntityName) @@ -82,13 +93,18 @@ private static int GenerateHashCode(IEntityPersister persister, object id) public override string ToString() { - return "EntityKey" + MessageHelper.InfoString(_persister, Identifier, _persister.Factory); + return IsNull + ? Util.StringHelper.NullObject + : "EntityKey" + MessageHelper.InfoString(_persister, Identifier, _persister?.Factory); } [SecurityCritical] void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue(nameof(Identifier), identifier); + if (identifier == null) + return; + info.AddValue(nameof(_persister.Factory), _persister.Factory); info.AddValue(nameof(EntityName), EntityName); } diff --git a/src/NHibernate/Engine/StatefulPersistenceContext.cs b/src/NHibernate/Engine/StatefulPersistenceContext.cs index 021bf96bd23..7e9cc10dc94 100644 --- a/src/NHibernate/Engine/StatefulPersistenceContext.cs +++ b/src/NHibernate/Engine/StatefulPersistenceContext.cs @@ -784,7 +784,7 @@ public object NarrowProxy(INHibernateProxy proxy, IEntityPersister persister, En /// public object ProxyFor(IEntityPersister persister, EntityKey key, object impl) { - if (!persister.HasProxy || key == null) + if (!persister.HasProxy || key.IsNull) return impl; INHibernateProxy proxy; diff --git a/src/NHibernate/Event/Default/AbstractSaveEventListener.cs b/src/NHibernate/Event/Default/AbstractSaveEventListener.cs index f4fe501ab2e..d962481f27f 100644 --- a/src/NHibernate/Event/Default/AbstractSaveEventListener.cs +++ b/src/NHibernate/Event/Default/AbstractSaveEventListener.cs @@ -177,7 +177,7 @@ protected virtual object PerformSave(object entity, object id, IEntityPersister } else { - key = null; + key = EntityKey.Null; } if (InvokeSaveLifecycle(entity, persister, source)) @@ -209,7 +209,7 @@ protected virtual object PerformSaveOrReplicate(object entity, EntityKey key, IE { Validate(entity, persister, source); - object id = key == null ? null : key.Identifier; + object id = key.IsNull ? null : key.Identifier; bool shouldDelayIdentityInserts = !requiresImmediateIdAccess; diff --git a/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs b/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs index 5fa2dc26de7..0c08a3dc922 100644 --- a/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs +++ b/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs @@ -95,7 +95,7 @@ public virtual void OnReplicate(ReplicateEvent @event) } bool regenerate = persister.IsIdentifierAssignedByInsert; // prefer re-generation of identity! - EntityKey key = regenerate ? null : source.GenerateEntityKey(id, persister); + EntityKey key = regenerate ? EntityKey.Null : source.GenerateEntityKey(id, persister); PerformSaveOrReplicate(entity, key, persister, regenerate, replicationMode, source, true); } diff --git a/src/NHibernate/Impl/MultiCriteriaImpl.cs b/src/NHibernate/Impl/MultiCriteriaImpl.cs index 4920acc5306..26e5df32c88 100644 --- a/src/NHibernate/Impl/MultiCriteriaImpl.cs +++ b/src/NHibernate/Impl/MultiCriteriaImpl.cs @@ -258,7 +258,7 @@ private void GetResultsFromDatabase(IList results) object o = loader.GetRowFromResultSet(reader, session, queryParameters, loader.GetLockModes(queryParameters.LockModes), - null, hydratedObjects[i], keys, true, + EntityKey.Null, hydratedObjects[i], keys, true, (persister, data) => cacheBatcher.AddToBatch(persister, data)); if (createSubselects[i]) { diff --git a/src/NHibernate/Loader/Loader.cs b/src/NHibernate/Loader/Loader.cs index a89c9b9b007..ef7f8ef9b22 100644 --- a/src/NHibernate/Loader/Loader.cs +++ b/src/NHibernate/Loader/Loader.cs @@ -313,7 +313,7 @@ protected object LoadSingleRow(DbDataReader resultSet, ISessionImplementor sessi try { result = - GetRowFromResultSet(resultSet, session, queryParameters, GetLockModes(queryParameters.LockModes), null, + GetRowFromResultSet(resultSet, session, queryParameters, GetLockModes(queryParameters.LockModes), EntityKey.Null, hydratedObjects, new EntityKey[entitySpan], returnProxies, (persister, data) => cacheBatcher.AddToBatch(persister, data)); } catch (HibernateException) @@ -347,7 +347,7 @@ internal static EntityKey GetOptionalObjectKey(QueryParameters queryParameters, } else { - return null; + return EntityKey.Null; } } @@ -392,7 +392,7 @@ internal object GetRowFromResultSet(DbDataReader resultSet, ISessionImplementor { object entity = row[i]; var key = keys[i]; - if (entity == null && key != null && IsChildFetchEntity(i)) + if (entity == null && key.IsNotNull && IsChildFetchEntity(i)) { // The entity was missing in the session, fallback on internal load (which will just yield a // proxy if the persister supports it). @@ -567,7 +567,7 @@ private static ISet[] Transpose(IList keys) for (int i = 0; i < keys.Count; i++) { EntityKey key = keys[i][j]; - if (key != null) + if (key.IsNotNull) { result[j].Add(key); } @@ -587,7 +587,7 @@ internal void CreateSubselects(IList keys, QueryParameters queryPar { for (int i = 0; i < rowKeys.Length; i++) { - if (rowKeys[i] != null && subSelects[i] != null) + if (rowKeys[i].IsNotNull && subSelects[i] != null) { session.PersistenceContext.BatchFetchQueue.AddSubselect(rowKeys[i], subSelects[i]); } @@ -777,7 +777,7 @@ private void RegisterNonExists(EntityKey[] keys, ISessionImplementor session) if (owner > -1) { EntityKey ownerKey = keys[owner]; - if (keys[i] == null && ownerKey != null) + if (keys[i].IsNull && ownerKey.IsNotNull) { bool isOneToOneAssociation = ownerAssociationTypes != null && ownerAssociationTypes[i] != null && ownerAssociationTypes[i].IsOneToOne; @@ -913,7 +913,7 @@ private EntityKey GetKeyFromResultSet(int i, IEntityPersister persister, object } } - return resultId == null ? null : session.GenerateEntityKey(resultId, persister); + return resultId == null ? EntityKey.Null : session.GenerateEntityKey(resultId, persister); } /// @@ -967,7 +967,7 @@ private object[] GetRow(DbDataReader rs, ILoadable[] persisters, EntityKey[] key object obj = null; EntityKey key = keys[i]; - if (key == null) + if (key.IsNull) { // do nothing /* TODO NH-1001 : if (persisters[i]...EntityType) is an OneToMany or a ManyToOne and @@ -1105,7 +1105,7 @@ private object InstanceNotYetLoaded(DbDataReader dr, int i, ILoadable persister, string instanceClass = GetInstanceClass(dr, i, persister, key.Identifier, session); - if (optionalObjectKey != null && key.Equals(optionalObjectKey)) + if (optionalObjectKey.IsNotNull && key.Equals(optionalObjectKey)) { // its the given optional object obj = optionalObject; diff --git a/src/NHibernate/Proxy/AbstractLazyInitializer.cs b/src/NHibernate/Proxy/AbstractLazyInitializer.cs index ddc12f5398b..2937e2ca15d 100644 --- a/src/NHibernate/Proxy/AbstractLazyInitializer.cs +++ b/src/NHibernate/Proxy/AbstractLazyInitializer.cs @@ -231,7 +231,7 @@ private void ErrorIfReadOnlySettingNotAvailable() private static EntityKey GenerateEntityKeyOrNull(object id, ISessionImplementor s, string entityName) { if (id == null || s == null || entityName == null) - return null; + return EntityKey.Null; return s.GenerateEntityKey(id, s.Factory.GetEntityPersister(entityName)); } @@ -250,7 +250,7 @@ private void CheckTargetState() private object GetProxyOrNull() { EntityKey entityKey = GenerateEntityKeyOrNull(_id, _session, _entityName); - if (entityKey != null && _session != null && _session.IsOpen) + if (entityKey.IsNotNull && _session != null && _session.IsOpen) { return _session.PersistenceContext.GetProxy(entityKey); } @@ -269,7 +269,7 @@ private void SetReadOnly(bool readOnly) if (initialized) { EntityKey key = GenerateEntityKeyOrNull(_id, _session, _entityName); - if (key != null && _session.PersistenceContext.ContainsEntity(key)) + if (key.IsNotNull && _session.PersistenceContext.ContainsEntity(key)) { _session.PersistenceContext.SetReadOnly(_target, readOnly); } diff --git a/src/NHibernate/Util/StringHelper.cs b/src/NHibernate/Util/StringHelper.cs index c80f1d85852..1a50abb5e53 100644 --- a/src/NHibernate/Util/StringHelper.cs +++ b/src/NHibernate/Util/StringHelper.cs @@ -10,6 +10,8 @@ namespace NHibernate.Util /// public static class StringHelper { + internal const string NullObject = "(null)"; + /// /// This allows for both CRLF and lone LF line separators. /// @@ -396,9 +398,9 @@ public static bool BooleanValue(string value) return trimmed.Equals("true", StringComparison.OrdinalIgnoreCase) || trimmed.Equals("t", StringComparison.OrdinalIgnoreCase); } - private static string NullSafeToString(object obj) + private static string NullSafeToString(T obj) { - return obj == null ? "(null)" : obj.ToString(); + return obj == null ? NullObject : obj.ToString(); } /// @@ -407,6 +409,11 @@ private static string NullSafeToString(object obj) /// /// public static string ToString(object[] array) + { + return ToString(array); + } + + internal static string ToString(T[] array) { int len = array.Length; From 87c7cbe6ea810e577351975b41d6f1c2dca40a32 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 16 Jan 2019 08:37:26 +0200 Subject: [PATCH 2/5] Make use of C#7.2 readonly struct and in modifier to keep assigment by ref in methods --- .../NHibernate.DomainModel.csproj | 1 + src/NHibernate.Test/NHibernate.Test.csproj | 1 + .../NHibernate.TestDatabaseSetup.csproj | 1 + src/NHibernate/Engine/EntityKey.cs | 2 +- src/NHibernate/Engine/IPersistenceContext.cs | 30 ++++++++--------- .../Engine/StatefulPersistenceContext.cs | 32 +++++++++---------- src/NHibernate/NHibernate.csproj | 1 + 7 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj b/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj index 751f0f7380e..6d73658ca00 100644 --- a/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj +++ b/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj @@ -5,6 +5,7 @@ $(NhLibTargetFrameworks) true $(NoWarn);3001;3002;3003;3005 + 7.2 NETFX;$(DefineConstants) diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index e6137c3a4ba..321a14d5661 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -6,6 +6,7 @@ true $(NoWarn);3001;3002;3003;3005 true + 7.2 NETFX;$(DefineConstants) diff --git a/src/NHibernate.TestDatabaseSetup/NHibernate.TestDatabaseSetup.csproj b/src/NHibernate.TestDatabaseSetup/NHibernate.TestDatabaseSetup.csproj index 2fff77ec8d5..50b6aa45827 100644 --- a/src/NHibernate.TestDatabaseSetup/NHibernate.TestDatabaseSetup.csproj +++ b/src/NHibernate.TestDatabaseSetup/NHibernate.TestDatabaseSetup.csproj @@ -6,6 +6,7 @@ $(NhAppTargetFrameworks) true $(NoWarn);3001;3002;3003;3005 + 7.2 NETFX;$(DefineConstants) diff --git a/src/NHibernate/Engine/EntityKey.cs b/src/NHibernate/Engine/EntityKey.cs index 1c18bc0036e..66b0493601b 100644 --- a/src/NHibernate/Engine/EntityKey.cs +++ b/src/NHibernate/Engine/EntityKey.cs @@ -12,7 +12,7 @@ namespace NHibernate.Engine /// and the identifier space (eg. tablename) /// [Serializable] - public struct EntityKey : ISerializable, IEquatable + public readonly struct EntityKey : ISerializable, IEquatable { public static EntityKey Null { get; } = new EntityKey(); diff --git a/src/NHibernate/Engine/IPersistenceContext.cs b/src/NHibernate/Engine/IPersistenceContext.cs index 3544bc2d3a9..097ccdf164b 100644 --- a/src/NHibernate/Engine/IPersistenceContext.cs +++ b/src/NHibernate/Engine/IPersistenceContext.cs @@ -113,7 +113,7 @@ public partial interface IPersistenceContext /// an entry of NO_ROW here is interpreted as an exception /// /// - object[] GetCachedDatabaseSnapshot(EntityKey key); + object[] GetCachedDatabaseSnapshot(in EntityKey key); /// /// Get the values of the natural id fields as known to the underlying @@ -123,22 +123,22 @@ public partial interface IPersistenceContext object[] GetNaturalIdSnapshot(object id, IEntityPersister persister); /// Add a canonical mapping from entity key to entity instance - void AddEntity(EntityKey key, object entity); + void AddEntity(in EntityKey key, object entity); /// /// Get the entity instance associated with the given EntityKey /// - object GetEntity(EntityKey key); + object GetEntity(in EntityKey key); /// Is there an entity with the given key in the persistence context - bool ContainsEntity(EntityKey key); + bool ContainsEntity(in EntityKey key); /// /// Remove an entity from the session cache, also clear /// up other state associated with the entity, all except /// for the EntityEntry /// - object RemoveEntity(EntityKey key); + object RemoveEntity(in EntityKey key); /// Get an entity cached by unique key object GetEntity(EntityUniqueKey euk); @@ -216,9 +216,9 @@ EntityEntry AddEntry(object entity, Status status, object[] loadedState, object /// Attempts to check whether the given key represents an entity already loaded within the /// current session. /// - /// The entity reference against which to perform the uniqueness check. /// The entity key. - void CheckUniqueness(EntityKey key, object obj); + /// The entity reference against which to perform the uniqueness check. + void CheckUniqueness(in EntityKey key, object obj); /// /// If the existing proxy is insufficiently "narrow" (derived), instantiate a new proxy @@ -231,14 +231,14 @@ EntityEntry AddEntry(object entity, Status status, object[] loadedState, object /// The internal cache key for the proxied entity. /// (optional) the actual proxied entity instance. /// An appropriately narrowed instance. - object NarrowProxy(INHibernateProxy proxy, IEntityPersister persister, EntityKey key, object obj); + object NarrowProxy(INHibernateProxy proxy, IEntityPersister persister, in EntityKey key, object obj); /// /// Return the existing proxy associated with the given EntityKey, or the /// third argument (the entity associated with the key) if no proxy exists. Init /// the proxy to the target implementation, if necessary. /// - object ProxyFor(IEntityPersister persister, EntityKey key, object impl); + object ProxyFor(IEntityPersister persister,in EntityKey key, object impl); /// /// Return the existing proxy associated with the given EntityKey, or the @@ -326,13 +326,13 @@ EntityEntry AddEntry(object entity, Status status, object[] loadedState, object CollectionEntry GetCollectionEntryOrNull(object collection); /// Get an existing proxy by key - object GetProxy(EntityKey key); + object GetProxy(in EntityKey key); /// Add a proxy to the session cache - void AddProxy(EntityKey key, INHibernateProxy proxy); + void AddProxy(in EntityKey key, INHibernateProxy proxy); /// Remove a proxy from the session cache - object RemoveProxy(EntityKey key); + object RemoveProxy(in EntityKey key); /// Called before cascading int IncrementCascadeLevel(); @@ -360,10 +360,10 @@ EntityEntry AddEntry(object entity, Status status, object[] loadedState, object /// /// Record the fact that the association belonging to the keyed entity is null. /// - void AddNullProperty(EntityKey ownerKey, string propertyName); + void AddNullProperty(in EntityKey ownerKey, string propertyName); /// Is the association property belonging to the keyed entity null? - bool IsPropertyNull(EntityKey ownerKey, string propertyName); + bool IsPropertyNull(in EntityKey ownerKey, string propertyName); /// /// Change the read-only status of an entity (or proxy). @@ -398,7 +398,7 @@ EntityEntry AddEntry(object entity, Status status, object[] loadedState, object /// bool IsReadOnly(object entityOrProxy); - void ReplaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, object generatedId); + void ReplaceDelayedEntityIdentityInsertKeys(in EntityKey oldKey, object generatedId); /// Is in a two-phase load? bool IsLoadFinished { get; } diff --git a/src/NHibernate/Engine/StatefulPersistenceContext.cs b/src/NHibernate/Engine/StatefulPersistenceContext.cs index 7e9cc10dc94..66f103e513c 100644 --- a/src/NHibernate/Engine/StatefulPersistenceContext.cs +++ b/src/NHibernate/Engine/StatefulPersistenceContext.cs @@ -355,7 +355,7 @@ public object[] GetDatabaseSnapshot(object id, IEntityPersister persister) /// an entry of NO_ROW here is interpreted as an exception /// /// - public object[] GetCachedDatabaseSnapshot(EntityKey key) + public object[] GetCachedDatabaseSnapshot(in EntityKey key) { object snapshot; if (!entitySnapshotsByKey.TryGetValue(key, out snapshot)) @@ -418,7 +418,7 @@ public object[] GetNaturalIdSnapshot(object id, IEntityPersister persister) } /// Add a canonical mapping from entity key to entity instance - public void AddEntity(EntityKey key, object entity) + public void AddEntity(in EntityKey key, object entity) { entitiesByKey[key] = entity; BatchFetchQueue.RemoveBatchLoadableEntityKey(key); @@ -427,7 +427,7 @@ public void AddEntity(EntityKey key, object entity) /// /// Get the entity instance associated with the given EntityKey /// - public object GetEntity(EntityKey key) + public object GetEntity(in EntityKey key) { object result; entitiesByKey.TryGetValue(key, out result); @@ -435,7 +435,7 @@ public object GetEntity(EntityKey key) } /// Is there an entity with the given key in the persistence context - public bool ContainsEntity(EntityKey key) + public bool ContainsEntity(in EntityKey key) { return entitiesByKey.ContainsKey(key); } @@ -445,7 +445,7 @@ public bool ContainsEntity(EntityKey key) /// up other state associated with the entity, all except /// for the EntityEntry /// - public object RemoveEntity(EntityKey key) + public object RemoveEntity(in EntityKey key) { object tempObject = entitiesByKey[key]; entitiesByKey.Remove(key); @@ -525,7 +525,7 @@ public EntityEntry AddEntity(object entity, Status status, object[] loadedState, } /// Adds an entity to the internal caches. - public EntityEntry AddEntity(object entity, Status status, object[] loadedState, EntityKey entityKey, object version, + public EntityEntry AddEntity(object entity, Status status, object[] loadedState, in EntityKey entityKey, object version, LockMode lockMode, bool existsInDatabase, IEntityPersister persister, bool disableVersionIncrement) { @@ -712,9 +712,9 @@ public object UnproxyAndReassociate(object maybeProxy) /// Attempts to check whether the given key represents an entity already loaded within the /// current session. /// - /// The entity reference against which to perform the uniqueness check. /// The entity key. - public void CheckUniqueness(EntityKey key, object obj) + /// The entity reference against which to perform the uniqueness check. + public void CheckUniqueness(in EntityKey key, object obj) { object entity = GetEntity(key); if (entity == obj) @@ -738,7 +738,7 @@ public void CheckUniqueness(EntityKey key, object obj) /// The internal cache key for the proxied entity. /// (optional) the actual proxied entity instance. /// An appropriately narrowed instance. - public object NarrowProxy(INHibernateProxy proxy, IEntityPersister persister, EntityKey key, object obj) + public object NarrowProxy(INHibernateProxy proxy, IEntityPersister persister, in EntityKey key, object obj) { bool alreadyNarrow = persister.ConcreteProxyClass.IsInstanceOfType(proxy); @@ -782,7 +782,7 @@ public object NarrowProxy(INHibernateProxy proxy, IEntityPersister persister, En /// third argument (the entity associated with the key) if no proxy exists. Init /// the proxy to the target implementation, if necessary. /// - public object ProxyFor(IEntityPersister persister, EntityKey key, object impl) + public object ProxyFor(IEntityPersister persister, in EntityKey key, object impl) { if (!persister.HasProxy || key.IsNull) return impl; @@ -1076,7 +1076,7 @@ public CollectionEntry GetCollectionEntryOrNull(object collection) } /// Get an existing proxy by key - public object GetProxy(EntityKey key) + public object GetProxy(in EntityKey key) { INHibernateProxy result; if (proxiesByKey.TryGetValue(key, out result)) @@ -1086,13 +1086,13 @@ public object GetProxy(EntityKey key) } /// Add a proxy to the session cache - public void AddProxy(EntityKey key, INHibernateProxy proxy) + public void AddProxy(in EntityKey key, INHibernateProxy proxy) { proxiesByKey[key] = proxy; } /// Remove a proxy from the session cache - public object RemoveProxy(EntityKey key) + public object RemoveProxy(in EntityKey key) { if (batchFetchQueue != null) { @@ -1295,13 +1295,13 @@ private object GetIndexInParent(string property, object childEntity, IEntityPers /// /// Record the fact that the association belonging to the keyed entity is null. /// - public void AddNullProperty(EntityKey ownerKey, string propertyName) + public void AddNullProperty(in EntityKey ownerKey, string propertyName) { nullAssociations.Add(new AssociationKey(ownerKey, propertyName)); } /// Is the association property belonging to the keyed entity null? - public bool IsPropertyNull(EntityKey ownerKey, string propertyName) + public bool IsPropertyNull(in EntityKey ownerKey, string propertyName) { return nullAssociations.Contains(new AssociationKey(ownerKey, propertyName)); } @@ -1382,7 +1382,7 @@ public bool IsReadOnly(object entityOrProxy) return isReadOnly; } - public void ReplaceDelayedEntityIdentityInsertKeys(EntityKey oldKey, object generatedId) + public void ReplaceDelayedEntityIdentityInsertKeys(in EntityKey oldKey, object generatedId) { object tempObject = entitiesByKey[oldKey]; entitiesByKey.Remove(oldKey); diff --git a/src/NHibernate/NHibernate.csproj b/src/NHibernate/NHibernate.csproj index ebedd248ddd..f38b44ac33b 100644 --- a/src/NHibernate/NHibernate.csproj +++ b/src/NHibernate/NHibernate.csproj @@ -12,6 +12,7 @@ NHibernate is a mature, open source object-relational mapper for the .NET framework. It is actively developed, fully featured and used in thousands of successful projects. ORM; O/RM; DataBase; DAL; ObjectRelationalMapping; NHibernate; ADO.Net; Core + 7.3 From 10a6584fbd33d12bbe89f8d01e8f308338a7bc37 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 22 Feb 2019 11:25:29 +0200 Subject: [PATCH 3/5] Rename Null -> Empty --- .../Action/EntityIdentityInsertAction.cs | 2 +- .../Event/Default/AbstractSaveEventListener.cs | 4 ++-- .../Default/DefaultReplicateEventListener.cs | 2 +- src/NHibernate/Async/Impl/MultiCriteriaImpl.cs | 2 +- src/NHibernate/Async/Loader/Loader.cs | 10 +++++----- src/NHibernate/Engine/EntityEntry.cs | 2 +- src/NHibernate/Engine/EntityKey.cs | 17 ++++++----------- .../Engine/StatefulPersistenceContext.cs | 2 +- .../Event/Default/AbstractSaveEventListener.cs | 4 ++-- .../Default/DefaultReplicateEventListener.cs | 2 +- src/NHibernate/Impl/MultiCriteriaImpl.cs | 2 +- src/NHibernate/Loader/Loader.cs | 18 +++++++++--------- .../Proxy/AbstractLazyInitializer.cs | 6 +++--- 13 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/NHibernate/Action/EntityIdentityInsertAction.cs b/src/NHibernate/Action/EntityIdentityInsertAction.cs index f517c3e809d..65eea399b20 100644 --- a/src/NHibernate/Action/EntityIdentityInsertAction.cs +++ b/src/NHibernate/Action/EntityIdentityInsertAction.cs @@ -19,7 +19,7 @@ public EntityIdentityInsertAction(object[] state, object instance, IEntityPersis : base(null, state, instance, persister, session) { this.isDelayed = isDelayed; - delayedEntityKey = this.isDelayed ? GenerateDelayedEntityKey() : EntityKey.Null; + delayedEntityKey = this.isDelayed ? GenerateDelayedEntityKey() : EntityKey.Empty; } public object GeneratedId diff --git a/src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs b/src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs index c586c15e6b9..bdad87ff871 100644 --- a/src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs +++ b/src/NHibernate/Async/Event/Default/AbstractSaveEventListener.cs @@ -150,7 +150,7 @@ protected virtual async Task PerformSaveAsync(object entity, object id, } else { - key = EntityKey.Null; + key = EntityKey.Empty; } if (InvokeSaveLifecycle(entity, persister, source)) @@ -184,7 +184,7 @@ protected virtual async Task PerformSaveOrReplicateAsync(object entity, cancellationToken.ThrowIfCancellationRequested(); Validate(entity, persister, source); - object id = key.IsNull ? null : key.Identifier; + object id = key.IsEmpty ? null : key.Identifier; bool shouldDelayIdentityInserts = !requiresImmediateIdAccess; diff --git a/src/NHibernate/Async/Event/Default/DefaultReplicateEventListener.cs b/src/NHibernate/Async/Event/Default/DefaultReplicateEventListener.cs index 006356c3da2..23122e893bd 100644 --- a/src/NHibernate/Async/Event/Default/DefaultReplicateEventListener.cs +++ b/src/NHibernate/Async/Event/Default/DefaultReplicateEventListener.cs @@ -102,7 +102,7 @@ public virtual async Task OnReplicateAsync(ReplicateEvent @event, CancellationTo } bool regenerate = persister.IsIdentifierAssignedByInsert; // prefer re-generation of identity! - EntityKey key = regenerate ? EntityKey.Null : source.GenerateEntityKey(id, persister); + EntityKey key = regenerate ? EntityKey.Empty : source.GenerateEntityKey(id, persister); await (PerformSaveOrReplicateAsync(entity, key, persister, regenerate, replicationMode, source, true, cancellationToken)).ConfigureAwait(false); } diff --git a/src/NHibernate/Async/Impl/MultiCriteriaImpl.cs b/src/NHibernate/Async/Impl/MultiCriteriaImpl.cs index da6c3364d5d..3a067ba8498 100644 --- a/src/NHibernate/Async/Impl/MultiCriteriaImpl.cs +++ b/src/NHibernate/Async/Impl/MultiCriteriaImpl.cs @@ -185,7 +185,7 @@ private async Task GetResultsFromDatabaseAsync(IList results, CancellationToken object o = await (loader.GetRowFromResultSetAsync(reader, session, queryParameters, loader.GetLockModes(queryParameters.LockModes), - EntityKey.Null, hydratedObjects[i], keys, true, + EntityKey.Empty, hydratedObjects[i], keys, true, (persister, data) => cacheBatcher.AddToBatch(persister, data), cancellationToken)).ConfigureAwait(false); if (createSubselects[i]) { diff --git a/src/NHibernate/Async/Loader/Loader.cs b/src/NHibernate/Async/Loader/Loader.cs index 05bb14b9451..acc9382f3d2 100644 --- a/src/NHibernate/Async/Loader/Loader.cs +++ b/src/NHibernate/Async/Loader/Loader.cs @@ -118,7 +118,7 @@ protected async Task LoadSingleRowAsync(DbDataReader resultSet, ISession try { result = - await (GetRowFromResultSetAsync(resultSet, session, queryParameters, GetLockModes(queryParameters.LockModes), EntityKey.Null, + await (GetRowFromResultSetAsync(resultSet, session, queryParameters, GetLockModes(queryParameters.LockModes), EntityKey.Empty, hydratedObjects, new EntityKey[entitySpan], returnProxies, (persister, data) => cacheBatcher.AddToBatch(persister, data), cancellationToken)).ConfigureAwait(false); } catch (OperationCanceledException) { throw; } @@ -185,7 +185,7 @@ internal async Task GetRowFromResultSetAsync(DbDataReader resultSet, ISe { object entity = row[i]; var key = keys[i]; - if (entity == null && key.IsNotNull && IsChildFetchEntity(i)) + if (entity == null && key.IsNotEmpty && IsChildFetchEntity(i)) { // The entity was missing in the session, fallback on internal load (which will just yield a // proxy if the persister supports it). @@ -564,7 +564,7 @@ private async Task GetKeyFromResultSetAsync(int i, IEntityPersister p } } - return resultId == null ? EntityKey.Null : session.GenerateEntityKey(resultId, persister); + return resultId == null ? EntityKey.Empty : session.GenerateEntityKey(resultId, persister); } /// @@ -620,7 +620,7 @@ private async Task GetRowAsync(DbDataReader rs, ILoadable[] persisters object obj = null; EntityKey key = keys[i]; - if (key.IsNull) + if (key.IsEmpty) { // do nothing /* TODO NH-1001 : if (persisters[i]...EntityType) is an OneToMany or a ManyToOne and @@ -756,7 +756,7 @@ private async Task InstanceNotYetLoadedAsync(DbDataReader dr, int i, ILo string instanceClass = await (GetInstanceClassAsync(dr, i, persister, key.Identifier, session, cancellationToken)).ConfigureAwait(false); - if (optionalObjectKey.IsNotNull && key.Equals(optionalObjectKey)) + if (optionalObjectKey.IsNotEmpty && key.Equals(optionalObjectKey)) { // its the given optional object obj = optionalObject; diff --git a/src/NHibernate/Engine/EntityEntry.cs b/src/NHibernate/Engine/EntityEntry.cs index 361d35e7d87..c485260bf8d 100644 --- a/src/NHibernate/Engine/EntityEntry.cs +++ b/src/NHibernate/Engine/EntityEntry.cs @@ -215,7 +215,7 @@ public EntityKey EntityKey { get { - if (cachedEntityKey.IsNull) + if (cachedEntityKey.IsEmpty) { if (id == null) throw new InvalidOperationException("cannot generate an EntityKey when id is null."); diff --git a/src/NHibernate/Engine/EntityKey.cs b/src/NHibernate/Engine/EntityKey.cs index 66b0493601b..15c4fcddc7a 100644 --- a/src/NHibernate/Engine/EntityKey.cs +++ b/src/NHibernate/Engine/EntityKey.cs @@ -6,7 +6,6 @@ namespace NHibernate.Engine { - //TODO 6.0: Remove IDeserializationCallback interface /// /// A globally unique identifier of an instance, consisting of the user-visible identifier /// and the identifier space (eg. tablename) @@ -14,10 +13,10 @@ namespace NHibernate.Engine [Serializable] public readonly struct EntityKey : ISerializable, IEquatable { - public static EntityKey Null { get; } = new EntityKey(); + public static EntityKey Empty { get; } = new EntityKey(); - public bool IsNull => identifier == null; - public bool IsNotNull => !IsNull; + public bool IsEmpty => identifier == null; + public bool IsNotEmpty => !IsEmpty; private readonly object identifier; private readonly IEntityPersister _persister; @@ -67,8 +66,8 @@ public override bool Equals(object other) public bool Equals(EntityKey other) { - if (other.IsNull) - return IsNull; + if (other.IsEmpty) + return IsEmpty; return other.RootEntityName.Equals(RootEntityName) @@ -93,7 +92,7 @@ private static int GenerateHashCode(IEntityPersister persister, object id) public override string ToString() { - return IsNull + return IsEmpty ? Util.StringHelper.NullObject : "EntityKey" + MessageHelper.InfoString(_persister, Identifier, _persister?.Factory); } @@ -108,9 +107,5 @@ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext contex info.AddValue(nameof(_persister.Factory), _persister.Factory); info.AddValue(nameof(EntityName), EntityName); } - - [Obsolete("IDeserializationCallback interface has no usages and will be removed in a future version")] - public void OnDeserialization(object sender) - {} } } diff --git a/src/NHibernate/Engine/StatefulPersistenceContext.cs b/src/NHibernate/Engine/StatefulPersistenceContext.cs index 66f103e513c..6254d7089e7 100644 --- a/src/NHibernate/Engine/StatefulPersistenceContext.cs +++ b/src/NHibernate/Engine/StatefulPersistenceContext.cs @@ -784,7 +784,7 @@ public object NarrowProxy(INHibernateProxy proxy, IEntityPersister persister, in /// public object ProxyFor(IEntityPersister persister, in EntityKey key, object impl) { - if (!persister.HasProxy || key.IsNull) + if (!persister.HasProxy || key.IsEmpty) return impl; INHibernateProxy proxy; diff --git a/src/NHibernate/Event/Default/AbstractSaveEventListener.cs b/src/NHibernate/Event/Default/AbstractSaveEventListener.cs index d962481f27f..7f1d40b5a2d 100644 --- a/src/NHibernate/Event/Default/AbstractSaveEventListener.cs +++ b/src/NHibernate/Event/Default/AbstractSaveEventListener.cs @@ -177,7 +177,7 @@ protected virtual object PerformSave(object entity, object id, IEntityPersister } else { - key = EntityKey.Null; + key = EntityKey.Empty; } if (InvokeSaveLifecycle(entity, persister, source)) @@ -209,7 +209,7 @@ protected virtual object PerformSaveOrReplicate(object entity, EntityKey key, IE { Validate(entity, persister, source); - object id = key.IsNull ? null : key.Identifier; + object id = key.IsEmpty ? null : key.Identifier; bool shouldDelayIdentityInserts = !requiresImmediateIdAccess; diff --git a/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs b/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs index 0c08a3dc922..1394d0be3d3 100644 --- a/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs +++ b/src/NHibernate/Event/Default/DefaultReplicateEventListener.cs @@ -95,7 +95,7 @@ public virtual void OnReplicate(ReplicateEvent @event) } bool regenerate = persister.IsIdentifierAssignedByInsert; // prefer re-generation of identity! - EntityKey key = regenerate ? EntityKey.Null : source.GenerateEntityKey(id, persister); + EntityKey key = regenerate ? EntityKey.Empty : source.GenerateEntityKey(id, persister); PerformSaveOrReplicate(entity, key, persister, regenerate, replicationMode, source, true); } diff --git a/src/NHibernate/Impl/MultiCriteriaImpl.cs b/src/NHibernate/Impl/MultiCriteriaImpl.cs index 26e5df32c88..f631abbb8a9 100644 --- a/src/NHibernate/Impl/MultiCriteriaImpl.cs +++ b/src/NHibernate/Impl/MultiCriteriaImpl.cs @@ -258,7 +258,7 @@ private void GetResultsFromDatabase(IList results) object o = loader.GetRowFromResultSet(reader, session, queryParameters, loader.GetLockModes(queryParameters.LockModes), - EntityKey.Null, hydratedObjects[i], keys, true, + EntityKey.Empty, hydratedObjects[i], keys, true, (persister, data) => cacheBatcher.AddToBatch(persister, data)); if (createSubselects[i]) { diff --git a/src/NHibernate/Loader/Loader.cs b/src/NHibernate/Loader/Loader.cs index ef7f8ef9b22..56d210b2177 100644 --- a/src/NHibernate/Loader/Loader.cs +++ b/src/NHibernate/Loader/Loader.cs @@ -313,7 +313,7 @@ protected object LoadSingleRow(DbDataReader resultSet, ISessionImplementor sessi try { result = - GetRowFromResultSet(resultSet, session, queryParameters, GetLockModes(queryParameters.LockModes), EntityKey.Null, + GetRowFromResultSet(resultSet, session, queryParameters, GetLockModes(queryParameters.LockModes), EntityKey.Empty, hydratedObjects, new EntityKey[entitySpan], returnProxies, (persister, data) => cacheBatcher.AddToBatch(persister, data)); } catch (HibernateException) @@ -347,7 +347,7 @@ internal static EntityKey GetOptionalObjectKey(QueryParameters queryParameters, } else { - return EntityKey.Null; + return EntityKey.Empty; } } @@ -392,7 +392,7 @@ internal object GetRowFromResultSet(DbDataReader resultSet, ISessionImplementor { object entity = row[i]; var key = keys[i]; - if (entity == null && key.IsNotNull && IsChildFetchEntity(i)) + if (entity == null && key.IsNotEmpty && IsChildFetchEntity(i)) { // The entity was missing in the session, fallback on internal load (which will just yield a // proxy if the persister supports it). @@ -567,7 +567,7 @@ private static ISet[] Transpose(IList keys) for (int i = 0; i < keys.Count; i++) { EntityKey key = keys[i][j]; - if (key.IsNotNull) + if (key.IsNotEmpty) { result[j].Add(key); } @@ -587,7 +587,7 @@ internal void CreateSubselects(IList keys, QueryParameters queryPar { for (int i = 0; i < rowKeys.Length; i++) { - if (rowKeys[i].IsNotNull && subSelects[i] != null) + if (rowKeys[i].IsNotEmpty && subSelects[i] != null) { session.PersistenceContext.BatchFetchQueue.AddSubselect(rowKeys[i], subSelects[i]); } @@ -777,7 +777,7 @@ private void RegisterNonExists(EntityKey[] keys, ISessionImplementor session) if (owner > -1) { EntityKey ownerKey = keys[owner]; - if (keys[i].IsNull && ownerKey.IsNotNull) + if (keys[i].IsEmpty && ownerKey.IsNotEmpty) { bool isOneToOneAssociation = ownerAssociationTypes != null && ownerAssociationTypes[i] != null && ownerAssociationTypes[i].IsOneToOne; @@ -913,7 +913,7 @@ private EntityKey GetKeyFromResultSet(int i, IEntityPersister persister, object } } - return resultId == null ? EntityKey.Null : session.GenerateEntityKey(resultId, persister); + return resultId == null ? EntityKey.Empty : session.GenerateEntityKey(resultId, persister); } /// @@ -967,7 +967,7 @@ private object[] GetRow(DbDataReader rs, ILoadable[] persisters, EntityKey[] key object obj = null; EntityKey key = keys[i]; - if (key.IsNull) + if (key.IsEmpty) { // do nothing /* TODO NH-1001 : if (persisters[i]...EntityType) is an OneToMany or a ManyToOne and @@ -1105,7 +1105,7 @@ private object InstanceNotYetLoaded(DbDataReader dr, int i, ILoadable persister, string instanceClass = GetInstanceClass(dr, i, persister, key.Identifier, session); - if (optionalObjectKey.IsNotNull && key.Equals(optionalObjectKey)) + if (optionalObjectKey.IsNotEmpty && key.Equals(optionalObjectKey)) { // its the given optional object obj = optionalObject; diff --git a/src/NHibernate/Proxy/AbstractLazyInitializer.cs b/src/NHibernate/Proxy/AbstractLazyInitializer.cs index 2937e2ca15d..5b9a441a02d 100644 --- a/src/NHibernate/Proxy/AbstractLazyInitializer.cs +++ b/src/NHibernate/Proxy/AbstractLazyInitializer.cs @@ -231,7 +231,7 @@ private void ErrorIfReadOnlySettingNotAvailable() private static EntityKey GenerateEntityKeyOrNull(object id, ISessionImplementor s, string entityName) { if (id == null || s == null || entityName == null) - return EntityKey.Null; + return EntityKey.Empty; return s.GenerateEntityKey(id, s.Factory.GetEntityPersister(entityName)); } @@ -250,7 +250,7 @@ private void CheckTargetState() private object GetProxyOrNull() { EntityKey entityKey = GenerateEntityKeyOrNull(_id, _session, _entityName); - if (entityKey.IsNotNull && _session != null && _session.IsOpen) + if (entityKey.IsNotEmpty && _session != null && _session.IsOpen) { return _session.PersistenceContext.GetProxy(entityKey); } @@ -269,7 +269,7 @@ private void SetReadOnly(bool readOnly) if (initialized) { EntityKey key = GenerateEntityKeyOrNull(_id, _session, _entityName); - if (key.IsNotNull && _session.PersistenceContext.ContainsEntity(key)) + if (key.IsNotEmpty && _session.PersistenceContext.ContainsEntity(key)) { _session.PersistenceContext.SetReadOnly(_target, readOnly); } From 18f9ce14510269a2ca942e7e99ed798a724b6482 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 22 Feb 2019 11:50:54 +0200 Subject: [PATCH 4/5] Move LangVersion to NHibernate.props --- build-common/NHibernate.props | 1 + src/NHibernate.DomainModel/NHibernate.DomainModel.csproj | 1 - .../NHibernate.Test.VisualBasic.vbproj | 1 + src/NHibernate.Test/NHibernate.Test.csproj | 1 - .../NHibernate.TestDatabaseSetup.csproj | 1 - src/NHibernate/NHibernate.csproj | 1 - 6 files changed, 2 insertions(+), 4 deletions(-) diff --git a/build-common/NHibernate.props b/build-common/NHibernate.props index d4fa4e5f508..9d64a18fcdd 100644 --- a/build-common/NHibernate.props +++ b/build-common/NHibernate.props @@ -14,6 +14,7 @@ net461;netcoreapp2.0 net461;netcoreapp2.0;netstandard2.0 + 7.3 NHibernate NHibernate.info diff --git a/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj b/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj index 6d73658ca00..751f0f7380e 100644 --- a/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj +++ b/src/NHibernate.DomainModel/NHibernate.DomainModel.csproj @@ -5,7 +5,6 @@ $(NhLibTargetFrameworks) true $(NoWarn);3001;3002;3003;3005 - 7.2 NETFX;$(DefineConstants) diff --git a/src/NHibernate.Test.VisualBasic/NHibernate.Test.VisualBasic.vbproj b/src/NHibernate.Test.VisualBasic/NHibernate.Test.VisualBasic.vbproj index 613f61cdd69..465339c247a 100644 --- a/src/NHibernate.Test.VisualBasic/NHibernate.Test.VisualBasic.vbproj +++ b/src/NHibernate.Test.VisualBasic/NHibernate.Test.VisualBasic.vbproj @@ -1,6 +1,7 @@  + The Visual Basic Unit Tests for NHibernate. $(NhAppTargetFrameworks) true diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index 321a14d5661..e6137c3a4ba 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -6,7 +6,6 @@ true $(NoWarn);3001;3002;3003;3005 true - 7.2 NETFX;$(DefineConstants) diff --git a/src/NHibernate.TestDatabaseSetup/NHibernate.TestDatabaseSetup.csproj b/src/NHibernate.TestDatabaseSetup/NHibernate.TestDatabaseSetup.csproj index 50b6aa45827..2fff77ec8d5 100644 --- a/src/NHibernate.TestDatabaseSetup/NHibernate.TestDatabaseSetup.csproj +++ b/src/NHibernate.TestDatabaseSetup/NHibernate.TestDatabaseSetup.csproj @@ -6,7 +6,6 @@ $(NhAppTargetFrameworks) true $(NoWarn);3001;3002;3003;3005 - 7.2 NETFX;$(DefineConstants) diff --git a/src/NHibernate/NHibernate.csproj b/src/NHibernate/NHibernate.csproj index f38b44ac33b..ebedd248ddd 100644 --- a/src/NHibernate/NHibernate.csproj +++ b/src/NHibernate/NHibernate.csproj @@ -12,7 +12,6 @@ NHibernate is a mature, open source object-relational mapper for the .NET framework. It is actively developed, fully featured and used in thousands of successful projects. ORM; O/RM; DataBase; DAL; ObjectRelationalMapping; NHibernate; ADO.Net; Core - 7.3 From 10409901eec2ee63bc25d71156afc6d87a8940f2 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 22 Feb 2019 12:58:19 +0200 Subject: [PATCH 5/5] More in modifiers --- src/NHibernate/Engine/BatchFetchQueue.cs | 10 +++++----- src/NHibernate/Engine/IPersistenceContext.cs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/NHibernate/Engine/BatchFetchQueue.cs b/src/NHibernate/Engine/BatchFetchQueue.cs index 2a4c61160f4..07253bc51de 100644 --- a/src/NHibernate/Engine/BatchFetchQueue.cs +++ b/src/NHibernate/Engine/BatchFetchQueue.cs @@ -61,7 +61,7 @@ public void Clear() /// The entity key for which to locate any defined subselect fetch. /// The fetch descriptor; may return null if no subselect fetch queued for /// this entity key. - public SubselectFetch GetSubselect(EntityKey key) + public SubselectFetch GetSubselect(in EntityKey key) { SubselectFetch result; subselectsByEntityKey.TryGetValue(key, out result); @@ -73,7 +73,7 @@ public SubselectFetch GetSubselect(EntityKey key) /// /// The entity for which to register the subselect fetch. /// The fetch descriptor. - public void AddSubselect(EntityKey key, SubselectFetch subquery) + public void AddSubselect(in EntityKey key, SubselectFetch subquery) { subselectsByEntityKey[key] = subquery; } @@ -84,7 +84,7 @@ public void AddSubselect(EntityKey key, SubselectFetch subquery) /// call this after loading the entity, since we might still /// need to load its collections) /// - public void RemoveSubselect(EntityKey key) + public void RemoveSubselect(in EntityKey key) { subselectsByEntityKey.Remove(key); } @@ -111,7 +111,7 @@ public void ClearSubselects() /// referenced entity to be included in a batch even though it is /// already associated with the . /// - public void AddBatchLoadableEntityKey(EntityKey key) + public void AddBatchLoadableEntityKey(in EntityKey key) { if (key.IsBatchLoadable) { @@ -129,7 +129,7 @@ public void AddBatchLoadableEntityKey(EntityKey key) /// need to batch fetch it anymore, remove it from the queue /// if necessary /// - public void RemoveBatchLoadableEntityKey(EntityKey key) + public void RemoveBatchLoadableEntityKey(in EntityKey key) { if (key.IsBatchLoadable) { diff --git a/src/NHibernate/Engine/IPersistenceContext.cs b/src/NHibernate/Engine/IPersistenceContext.cs index 097ccdf164b..c207b5e2e48 100644 --- a/src/NHibernate/Engine/IPersistenceContext.cs +++ b/src/NHibernate/Engine/IPersistenceContext.cs @@ -425,7 +425,7 @@ public static EntityEntry AddEntity( object entity, Status status, object[] loadedState, - EntityKey entityKey, + in EntityKey entityKey, object version, LockMode lockMode, bool existsInDatabase,