Пример #1
0
        private async ValueTask RemapEntityKeys(KeyMapping keyMapping, bool isAsync, CancellationToken token = default)
        {
            if (keyMapping.Map.Count == 0)
            {
                return;
            }
            using (Activate()) {
                if (!LazyKeyGenerationIsEnabled)
                {
                    await Persist(PersistReason.RemapEntityKeys, isAsync, token).ConfigureAwait(false);

                    Invalidate();
                }
                if (IsDebugEventLoggingEnabled)
                {
                    OrmLog.Debug(Strings.LogSessionXRemappingEntityKeys, this);
                }

                foreach (var entityState in EntityChangeRegistry.GetItems(PersistenceState.New))
                {
                    var key         = entityState.Key;
                    var remappedKey = keyMapping.TryRemapKey(key);
                    if (remappedKey != key)
                    {
                        entityState.RemapKey(remappedKey);
                    }
                    EntityStateCache.Add(entityState);
                }
                ProcessChangesOfEntitySets(entitySetState => entitySetState.RemapKeys(keyMapping));
                EntityEvents.RemapKeys(keyMapping);
            }
        }
Пример #2
0
 internal void RemapEntityKeys(KeyMapping keyMapping)
 {
     if (keyMapping.Map.Count == 0)
     {
         return;
     }
     using (Activate()) {
         if (!LazyKeyGenerationIsEnabled)
         {
             Persist(PersistReason.RemapEntityKeys);
             Invalidate();
         }
         OrmLog.Debug(Strings.LogSessionXRemappingEntityKeys, this);
         foreach (var entityState in EntityChangeRegistry.GetItems(PersistenceState.New))
         {
             var key         = entityState.Key;
             var remappedKey = keyMapping.TryRemapKey(key);
             if (remappedKey != key)
             {
                 entityState.RemapKey(remappedKey);
             }
             EntityStateCache.Add(entityState);
         }
         ProcessChangesOfEntitySets(entitySetState => entitySetState.RemapKeys(keyMapping));
         EntityEvents.RemapKeys(keyMapping);
     }
 }
Пример #3
0
        internal void RemoveOrCreateRemovedEntity(Type type, Key key, EntityRemoveReason reason)
        {
            // Checking for deleted entity with the same key
            var result = EntityStateCache[key, false];

            if (result != null)
            {
                if (result.PersistenceState == PersistenceState.Removed)
                {
                    return;
                }
                result.Entity.RemoveLaterInternal(reason);
                return;
            }

            EnforceChangeRegistrySizeLimit(); // Must be done before new entity registration
            result = new EntityState(this, key, null)
            {
                PersistenceState = PersistenceState.Removed
            };
            EntityStateCache.Add(result);

            if (IsDebugEventLoggingEnabled)
            {
                OrmLog.Debug(Strings.LogSessionXCachingY, this, result);
            }
        }
Пример #4
0
        private EntityState AddEntityStateToCache(Key key, Tuple tuple, bool isStale)
        {
            var result = new EntityState(this, key, tuple, isStale)
            {
                PersistenceState = PersistenceState.Synchronized
            };

            EntityStateCache.Add(result);
            OrmLog.Debug(Strings.LogSessionXCachingY, this, result);
            return(result);
        }
Пример #5
0
        internal EntityState CreateEntityState(Key key, bool failIfStateIsAlreadyBound)
        {
            // Checking for deleted entity with the same key
            var result = EntityStateCache[key, false];

            EnforceChangeRegistrySizeLimit(); // Must be done before new entity registration

            // If type is unknown, we consider tuple is null,
            // so its Entity is considered as non-existing
            Tuple tuple = null;

            if (key.HasExactType)
            {
                // A tuple with all the fields set to default values rather then N/A
                var typeInfo = key.TypeInfo;
                tuple = typeInfo.CreateEntityTuple(key.Value, StorageNode.TypeIdRegistry[typeInfo]);
            }

            if (result == null)
            {
                result = new EntityState(this, key, tuple)
                {
                    PersistenceState = PersistenceState.New
                };
                EntityStateCache.Add(result);
            }
            else
            {
                if (result.Entity != null && !result.Entity.IsRemoved && failIfStateIsAlreadyBound)
                {
                    throw new UniqueConstraintViolationException(string.Format(Strings.ExEntityWithKeyXAlreadyExists, key));
                }
                result.Key              = key;
                result.Tuple            = tuple;
                result.PersistenceState = PersistenceState.New;
            }

            if (IsDebugEventLoggingEnabled)
            {
                OrmLog.Debug(Strings.LogSessionXCachingY, this, result);
            }

            return(result);
        }