Example #1
0
        public async Task UpdateAsync(T entity, bool checkConflict = false)
        {
            var changeListeners = new List <Action <EntityChange <T> > >();
            T   internalEntity;

            using (await Lock.WriterLockAsync())
            {
                OnBeforeEntityChanged(EntityChangeType.Update, entity);

                if (checkConflict)
                {
                    CheckForConcurrencyConflict(entity);
                }

                entity.Revision++;
                internalEntity = entity.Clone();
                T oldEntity = Entities[entity.Id];
                Entities[entity.Id] = internalEntity;

                if (_changeListeners.TryGetValue(entity.Id, out ISet <Action <EntityChange <T> > > listeners))
                {
                    changeListeners.AddRange(listeners);
                }

                OnEntityChanged(EntityChangeType.Update, oldEntity, internalEntity, changeListeners);

                if (PersistenceRepository != null)
                {
                    await PersistenceRepository.UpdateAsync(entity);
                }
            }
            SendToSubscribers(changeListeners, EntityChangeType.Update, internalEntity);
        }
Example #2
0
        public async Task UpdateAsync(T entity, bool checkConflict = false,
                                      CancellationToken ct         = default(CancellationToken))
        {
            var allSubscriptions = new List <Subscription <T> >();
            T   internalEntity;

            using (await Lock.WriterLockAsync(ct))
            {
                OnBeforeEntityChanged(EntityChangeType.Update, entity);

                if (checkConflict)
                {
                    CheckForConcurrencyConflict(entity);
                }

                entity.Revision++;
                internalEntity = entity.Clone();
                T oldEntity = Entities[entity.Id];
                Entities[entity.Id] = internalEntity;

                GetIdSubscriptions(entity.Id, allSubscriptions);

                OnEntityChanged(EntityChangeType.Update, oldEntity, internalEntity, allSubscriptions);

                if (PersistenceRepository != null)
                {
                    await PersistenceRepository.UpdateAsync(entity, false, ct);
                }
            }
            SendToSubscribers(allSubscriptions, EntityChangeType.Update, internalEntity);
        }